Cómo cambiar el valor del atributo en la sección appSettings con la transformación Web.config

260

¿Es posible transformar el siguiente archivo Web.config appSettings:

<appSettings>
    <add key="developmentModeUserId" value="00297022" />
    <add key="developmentMode" value="true" />
    /* other settings here that should stay */
</appSettings>

en algo como esto:

<appSettings>
    <add key="developmentMode" value="false" />
    /* other settings here that should stay */
</appSettings>

Entonces, necesito eliminar la clave developmentModeUserId , y necesito reemplazar el valor de la clave developmentMode .

libélula
fuente

Respuestas:

453

Quieres algo como:

<appSettings>
  <add key="developmentModeUserId" xdt:Transform="Remove" xdt:Locator="Match(key)"/>
  <add key="developmentMode" value="false" xdt:Transform="SetAttributes"
          xdt:Locator="Match(key)"/>
</appSettings>

Consulte también: Web.config Transformation Syntax para la implementación de proyectos de aplicaciones web

Joe
fuente
24
¡Tenga en cuenta que las teclas distinguen entre mayúsculas y minúsculas!
Cosmin
2
Excelente respuesta Intenté opciones de terceros como Slow Cheetah y no llegué a ninguna parte, esto fue simple y perfecto.
Steve
2
@stevens: Necesitarías Slow Cheetah si quieres transformar, por ejemplo, archivos app.config para aplicaciones nativas. Sin embargo, la sintaxis debería ser idéntica si recuerdo (ha pasado un tiempo desde que tuve que usar Slow Cheetah).
Ellesedil
una alternativa al tramposo lento es crear myotherconfig.staging.config y en la transformación web.Staging.config, transformar la referencia a myotherconfig.config en web.config
nologo
3
Solo una pequeña aclaración que podría ayudar a algunas personas: la xdt:Transform="SetAttributes" xdt:Locator="Match(key)"parte debe usarse en Web.Whatever.config y no en el archivo Web.config.
user3533716
11

Reemplazar todas las configuraciones de aplicaciones

Este es el caso excesivo en el que solo desea reemplazar una sección completa de web.config. En este caso, reemplazaré todos los AppSettings en web.config con la nueva configuración en web.release.config. Esta es mi aplicación web.config de línea de base

<appSettings>
  <add key="KeyA" value="ValA"/>
  <add key="KeyB" value="ValB"/>
</appSettings>

Ahora en mi archivo web.release.config, voy a crear una sección de Ajustes de aplicaciones, excepto que incluiré el atributo xdt: Transform = "Reemplazar" ya que solo quiero reemplazar todo el elemento. No tuve que usar xdt: Locator porque no hay nada que localizar, solo quiero limpiar la pizarra y reemplazar todo.

<appSettings xdt:Transform="Replace">
  <add key="ProdKeyA" value="ProdValA"/>
  <add key="ProdKeyB" value="ProdValB"/>
  <add key="ProdKeyC" value="ProdValC"/>
</appSettings>

Tenga en cuenta que en el archivo web.release.config, la sección Configuración de mi aplicación tiene tres claves en lugar de dos, y las claves ni siquiera son las mismas. Ahora echemos un vistazo al archivo web.config generado qué sucede cuando publicamos:

<appSettings>
   <add key="ProdKeyA" value="ProdValA"/>
   <add key="ProdKeyB" value="ProdValB"/>
   <add key="ProdKeyC" value="ProdValC"/>
 </appSettings>

Justo como esperábamos: la configuración de la aplicación web.config se reemplazó completamente por los valores en la configuración de web.release. ¡Eso fue fácil!

Joe
fuente
9

Si desea realizar la transformación de la configuración de su aplicación desde el archivo de configuración web a web.Release.config, debe realizar los siguientes pasos. Deje que el archivo de configuración de la aplicación web.config sea este:

<appSettings>
     <add key ="K1" value="Debendra Dash"/>
  </appSettings>

Ahora aquí está la web.Release.config para la transformación.

<appSettings>
    <add key="K1" value="value dynamicly from Realease"
       xdt:Transform="SetAttributes"
          xdt:Locator="Match(key)"   
         />
  </appSettings>

Esto transformará el valor de K1 en el nuevo valor en modo real.

Debendra Dash
fuente
1

No me gusta que las transformaciones tengan más información de la necesaria. Entonces, en lugar de restablecer las claves, simplemente declaro la condición y la intención . Es mucho más fácil ver la intención cuando se hace así, al menos en mi opinión. Además, trato de poner todos los xdtatributos primero para indicar al lector, estas son transformaciones y no cosas nuevas que se están definiendo.

<appSettings>
  <add xdt:Locator="Condition(@key='developmentModeUserId')" xdt:Transform="Remove" />
  <add xdt:Locator="Condition(@key='developmentMode')" xdt:Transform="SetAttributes"
       value="false"/>
</appSettings>

En lo anterior, es mucho más fácil ver que el primero está eliminando el elemento. El segundo es establecer atributos. Establecerá / reemplazará cualquier atributo que defina aquí. En este caso, simplemente se establecerá valueen false.

CodificaciónYoshi
fuente