Como alterar o valor do atributo na seção appSettings com a transformação Web.config

260

É possível transformar o seguinte arquivo app.ettings Web.config:

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

em algo como isto:

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

Portanto, preciso remover a chave developmentModeUserId e substituir o valor da chave developmentMode .

libélula
fonte

Respostas:

452

Você quer 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 também: Sintaxe de transformação Web.config para implantação de projetos de aplicativos Web

Joe
fonte
24
Observe que as teclas diferenciam maiúsculas de minúsculas!
Cosmin
2
Excelente resposta. Eu estava tentando opções de terceiros como o Slow Cheetah e não estava chegando a lugar nenhum - isso era simples e perfeito.
Steve
2
@ stevens: Você precisaria do Slow Cheetah se quiser transformar, digamos, arquivos app.config para aplicativos nativos. A sintaxe, no entanto, deve ser idêntica se bem me lembro (já faz um tempo desde que eu tive que usar o Slow Cheetah).
Ellesedil
uma alternativa para batoteiro lento é criar myotherconfig.staging.config e em transformar o web.Staging.config, transformar a referência a myotherconfig.config no web.config
nologo
3
Apenas um pequeno esclarecimento que pode ajudar algumas pessoas: a xdt:Transform="SetAttributes" xdt:Locator="Match(key)"peça deve ser usada no Web.Whatever.config e não no arquivo Web.config.
user3533716
11

Substituindo todas as AppSettings

Este é o caso de exagero em que você deseja substituir apenas uma seção inteira do web.config. Nesse caso, substituirei todos os AppSettings no web.config e novas configurações no web.release.config. Esta é a minha linha de base web.config appSettings:

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

Agora, no meu arquivo web.release.config, vou criar uma seção appSettings, exceto que incluirei o atributo xdt: Transform = ”Replace”, pois quero substituir apenas o elemento inteiro. Não precisei usar o xdt: Locator porque não há nada para localizar - só quero limpar a lousa e substituir tudo.

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

Observe que no arquivo web.release.config, a seção appSettings possui três chaves em vez de duas, e as chaves não são iguais. Agora, vejamos o arquivo web.config gerado, o que acontece quando publicamos:

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

Assim como esperávamos - o web.config appSettings foi completamente substituído pelos valores em web.release config. Essa foi fácil!

Joe
fonte
9

Se você deseja transformar a configuração de seu aplicativo de arquivo de configuração da web para web.Release.config, execute as seguintes etapas. Deixe o arquivo de configuração do aplicativo web.config

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

Agora, aqui está o web.Release.config da transformação.

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

Isso transformará o valor de K1 no novo valor no modo realese.

Debendra Dash
fonte
1

Não gosto que as transformações tenham mais informações do que o necessário. Então, em vez de reafirmar as chaves, simplesmente declaro a condição e a intenção . É muito mais fácil ver a intenção quando feita assim, pelo menos na IMO. Além disso, tento colocar todos os xdtatributos em primeiro lugar para indicar ao leitor, são transformações e não coisas novas sendo definidas.

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

No exposto acima, é muito mais fácil ver que o primeiro está removendo o elemento. O segundo é definir atributos. Ele definirá / substituirá todos os atributos que você definir aqui. Nesse caso, ele simplesmente será definido valuecomo false.

CodificaçãoYoshi
fonte