Comment changer la valeur de l'attribut dans la section appSettings avec la transformation Web.config

260

Est-il possible de transformer le fichier appSettings Web.config suivant:

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

en quelque chose comme ça:

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

Donc, je dois supprimer la clé developmentModeUserId et je dois remplacer la valeur de la clé developmentMode .

libellule
la source

Réponses:

453

Vous voulez quelque chose comme:

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

Voir aussi: Syntaxe de transformation Web.config pour le déploiement de projet d'application Web

Joe
la source
24
Notez que les touches sont sensibles à la casse!
Cosmin
2
Excellente réponse. J'essayais des options tierces comme Slow Cheetah et je n'étais nulle part - c'était simple et parfait.
Steve
2
@stevens: Vous auriez besoin de Slow Cheetah si vous voulez transformer, disons, des fichiers app.config pour des applications natives. La syntaxe, cependant, devrait être identique si je me souviens bien (cela fait un moment que j'ai dû utiliser Slow Cheetah).
Ellesedil
une alternative au tricheur lent est de créer myotherconfig.staging.config et dans la transformation web.Staging.config, de transformer la référence en myotherconfig.config dans web.config
nologo
3
Juste une petite clarification qui pourrait aider certaines personnes: la xdt:Transform="SetAttributes" xdt:Locator="Match(key)"pièce doit être utilisée dans le Web.Wwhat.config et non dans le fichier Web.config.
user3533716
11

Remplacement de tous les AppSettings

C'est le cas exagéré où vous voulez simplement remplacer une section entière du web.config. Dans ce cas, je remplacerai tous les AppSettings dans le web.config et les nouveaux paramètres dans web.release.config. Ceci est mon application web.config de base

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

Maintenant, dans mon fichier web.release.config, je vais créer une section appSettings sauf que j'inclurai l'attribut xdt: Transform = "Replace" car je veux simplement remplacer l'élément entier. Je n'ai pas eu à utiliser xdt: Locator car il n'y a rien à localiser - je veux juste essuyer l'ardoise et tout remplacer.

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

Notez que dans le fichier web.release.config ma section appSettings a trois clés au lieu de deux, et les clés ne sont même pas les mêmes. Voyons maintenant le fichier web.config généré ce qui se passe lorsque nous publions:

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

Tout comme nous nous y attendions - les appSettings web.config ont été complètement remplacés par les valeurs dans la configuration web.release. C'était facile!

Joe
la source
9

Si vous souhaitez transformer votre paramètre d'application du fichier de configuration Web en web.Release.config, vous devez effectuer les étapes suivantes. Laissez votre fichier de configuration d'application web.config est le suivant:

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

Voici maintenant le web.Release.config pour la transformation.

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

Cela transformera la valeur de K1 en la nouvelle valeur en mode réel.

Debendra Dash
la source
1

Je n'aime pas que les transformations aient plus d'informations que nécessaire. Donc, au lieu de reformuler les clés, j'énonce simplement la condition et l' intention . Il est beaucoup plus facile de voir l'intention lorsque cela est fait, du moins l'OMI. Aussi, j'essaie de mettre tous les xdtattributs en premier pour indiquer au lecteur, ce sont des transformations et non de nouvelles choses en train d'être définies.

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

Dans ce qui précède, il est beaucoup plus facile de voir que le premier supprime l'élément. Le 2e définit les attributs. Il définira / remplacera tous les attributs que vous définissez ici. Dans ce cas, il sera simplement défini valuesur false.

CodageYoshi
la source