Estou usando a transformação web.config, conforme descrito na publicação abaixo, para gerar configurações para diferentes ambientes.
http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html
Eu posso fazer uma transformação "Substituir" combinando com a chave, por exemplo
<add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />
E eu posso fazer "inserções", por exemplo
<add key="UseLivePaymentService" value="true" xdt:Transform="Insert" />
Mas o que eu realmente consideraria útil é uma transformação ReplaceOrInsert, pois nem sempre posso confiar no arquivo de configuração original que possui / não possui uma determinada chave.
Há alguma maneira de fazer isso?
asp.net
web-config-transform
xslt
xdt-transform
Chris Haines
fonte
fonte
Respostas:
Encontrei uma solução alternativa barata. Não é bonito e não funcionará muito bem se você tiver muitos elementos que precisam ser "Substituir ou inserir".
Faça um "Remover" e um "InsertAfter | InsertBefore".
Por exemplo,
fonte
Em conjunto com o
xdt:Transform="Remove"
usoxdt:Transform="InsertIfMissing"
no VS2012.fonte
Remove
tarefa remove apenas a primeira ocorrência. Alguns elementos podem ter várias ocorrências. Não consigo imaginar que você queira isso, mas isso removeria a primeira ocorrência e pularia aInsertIfMissing
tarefa. Mas você teria razão se ele usasseRemoveAll
.Use a
InsertIfMissing
transformação para garantir que o appSetting exista.Em seguida, use a
Replace
transformação para definir seu valor.Você também pode usar a
SetAttributes
transformação em vez deReplace
. A diferença é queSetAttributes
não toca nos nós filhos.Essas técnicas são muito melhores que remover + inserir porque os nós existentes não são movidos para a parte inferior do nó pai. Novos nós são anexados no final. Os nós existentes permanecem onde estão no arquivo de origem.
Esta resposta se aplica apenas a versões mais recentes do Visual Studio (2012 ou mais recente).
fonte
Um método melhor para mim era inserir o elemento apenas se ele não existir, pois estou definindo apenas alguns atributos. A remoção do elemento descartaria quaisquer outros atributos do elemento principal se eles existissem.
exemplo: web.config (sem elemento)
web.config (com elemento)
Usando o Locator com uma expressão XPath, adiciono o nó se ele não existir e defino meu atributo:
os dois arquivos web.config resultantes têm includeExceptionDetailInFaults = "true" e o segundo preserva o atributo httpsHelpPageEnabled, onde o método remover / inserir não.
fonte