Transformação App.Config para projetos que não são projetos da Web no Visual Studio 2010?

Para o aplicativo baseado na Web do Visual Studio 2010, temos resources de Configuração de Transformação pelos quais podemos manter vários arquivos de configuração para diferentes ambientes. Mas o mesmo recurso não está disponível para arquivos App.Config para Windows Services / WinForms ou Console Application.

Há uma solução disponível como sugerido aqui: Aplicando a mágica do XDT ao App.Config .

No entanto, não é simples e requer um número de etapas. Existe uma maneira mais fácil de conseguir o mesmo para arquivos app.config?

Isso funciona agora com o Visual Studio AddIn tratado neste artigo: SlowCheetah – Sintaxe de transformação Web.config agora generalizada para qualquer arquivo de configuração XML .

Você pode clicar com o botão direito do mouse em seu web.config e clicar em “Adicionar configurações de configuração”. Quando você fizer isso, você obterá um web.debug.config e um web.release.config. Você pode criar um web.whatever.config, se desejar, desde que o nome esteja alinhado com um perfil de configuração. Esses arquivos são apenas as alterações desejadas, não uma cópia completa do seu web.config.

Você pode pensar que você gostaria de usar o XSLT para transformar um web.config, mas enquanto eles se sentem intuitivamente certos, é realmente muito detalhado.

Aqui estão duas transformações, uma usando XSLT e a mesma usando a syntax / namespace da transformação de documento XML. Como com todas as coisas, há várias maneiras no XSLT para fazer isso, mas você obtém a ideia geral. O XSLT é uma linguagem de transformação de tree generalizada, enquanto essa implantação é otimizada para um subconjunto específico de cenários comuns. Mas, a parte legal é que cada transformação XDT é um plugin .NET, então você pode fazer o seu próprio.

< ?xml version="1.0" ?>           NewSetting New Setting Value     

Ou a mesma coisa através da transformação de implantação:

      

Eu tentei várias soluções e aqui é o mais simples que eu pessoalmente encontrei.
Dan apontou nos comentários que o post original pertence a Oleg Sych – obrigado, Oleg!

Aqui estão as instruções:

1. Adicione um arquivo XML para cada configuração ao projeto.

Normalmente, você terá configurações de Debug e Release para nomear seus arquivos App.Debug.config e App.Release.config . No meu projeto, criei uma configuração para cada tipo de ambiente, então você pode querer experimentar isso.

2. Descarregue o projeto e abra o arquivo .csproj para edição

O Visual Studio permite que você edite arquivos .csproj diretamente no editor – basta descarregar o projeto primeiro. Em seguida, clique com o botão direito nele e selecione Edit .csproj .

3. Vincule arquivos de configuração de App. *. Ao App.config principal

Encontre a seção do arquivo de projeto que contém todas as referências App.config e App.*.config . Você notará que suas ações de construção estão definidas como None :

    

Primeiro, defina a ação de compilation para todos eles para o Content .
Em seguida, torne todos os arquivos específicos da configuração dependentes do App.config principal, de modo que o Visual Studio os App.config como arquivos de designer e de código subjacente.

Substitua o XML acima pelo abaixo:

   App.config   App.config  

4. Ativar transformações mágicas

No final do arquivo depois

  

e antes do final

  

insira o seguinte XML:

          $(TargetFileName).config    

Agora você pode recarregar o projeto, construí-lo e aproveitar as transformações do App.config !

Para sua informação

Certifique-se de que seus arquivos App.*.config tenham a configuração correta como esta:

 < ?xml version="1.0" encoding="utf-8"?>    

Outra solução que eu encontrei é não usar as transformações, mas apenas ter um arquivo de configuração separado, por exemplo, app.Release.config. Em seguida, adicione esta linha ao seu arquivo csproj.

   App.Release.config  

Isso não só gerará o arquivo myprogram.exe.config correto, mas se você estiver usando o Projeto de Instalação e Implantação no Visual Studio para gerar o MSI, ele forçará o projeto de implantação a usar o arquivo de configuração correto durante o empacotamento.

Na minha experiência, as coisas que eu preciso para tornar o ambiente específico são coisas como strings de conexão, configurações de aplicativos e configurações de smpt. O sistema de configuração permite especificar essas coisas em arquivos separados. Então você pode usar isso no seu app.config / web.config:

         

O que eu normalmente faço é colocar essas seções específicas de configuração em arquivos separados, em uma subpasta chamada ConfigFiles (na raiz da solução ou no nível do projeto, depende). Eu defino um arquivo por configuração, por exemplo, smtp.config.Debug e smtp.config.Release.

Então você pode definir um evento de pré-compilation assim:

 copy $(ProjectDir)ConfigFiles\smtp.config.$(ConfigurationName) $(TargetDir)smtp.config 

No desenvolvimento da equipe, você pode aprimorar ainda mais isso incluindo o% COMPUTERNAME% e / ou% USERNAME% na convenção.

Naturalmente, isso implica que os arquivos de destino (x.config) NÃO devem ser colocados no controle de origem (desde que sejam gerados). Você ainda deve adicioná-los ao arquivo de projeto e definir sua propriedade de tipo de saída como ‘copiar sempre’ ou ‘copiar se for mais recente’.

Simples, extensível e funciona para todos os tipos de projetos do Visual Studio (console, winforms, wpf, web).

Você pode usar um arquivo de configuração separado por configuração, por exemplo, app.Debug.config, app.Release.config e, em seguida, usar a variável de configuração em seu arquivo de projeto:

  App.$(Configuration).config  

Isso criará o arquivo ProjectName.exe.config correto, dependendo da configuração que você está criando.

Inspirado por Oleg e outros nessa questão, tomei a solução https://stackoverflow.com/a/5109530/2286801 um passo adiante para ativar o seguinte.

  • Funciona com o ClickOnce
  • Trabalha com projetos de instalação e implantação no VS 2010
  • Trabalha com VS2010, 2013, 2015 (não testou 2012, embora deva funcionar também).
  • Trabalha com Team Build. (Você deve instalar A) Visual Studio ou B) Microsoft.Web.Publishing.targets e Microsoft.Web.Publishing.Tasks.dll)

Essa solução funciona executando a transformação app.config antes que o app.config seja mencionado pela primeira vez no processo do MSBuild. Ele usa um arquivo de destinos externos para facilitar o gerenciamento em vários projetos.

Instruções:

Etapas semelhantes para a outra solução. Eu citei o que permanece o mesmo e incluí-lo para conclusão e comparação mais fácil.

0. Adicione um novo arquivo ao seu projeto chamado AppConfigTransformation.targets

     10.0      $(IntermediateOutputPath)$(TargetFileName).config          

1. Adicione um arquivo XML para cada configuração ao projeto.

Normalmente, você terá configurações de Debug e Release para nomear seus arquivos App.Debug.config e App.Release.config. No meu projeto, criei uma configuração para cada tipo de ambiente, então você pode querer experimentar isso.

2. Descarregue o projeto e abra o arquivo .csproj para edição

O Visual Studio permite que você edite o arquivo .csproj diretamente no editor – basta descarregar o projeto primeiro. Em seguida, clique com o botão direito e selecione Editar .csproj.

3. Vincule arquivos de configuração de App. *. Ao App.config principal

Localize a seção do arquivo de projeto que contém todas as referências App.config e App. *. Config e substitua da seguinte maneira. Você notará que usamos None em vez de Content.

    app.config   app.config   app.config   

4. Ativar transformações mágicas

No final do arquivo depois

  

e antes do final

  

insira o seguinte XML:

  

Feito!

Eu escrevi uma extensão legal para automatizar a transformação app.config como aquela construída na Transformada de Configuração do Projeto de Aplicativo da Web.

A maior vantagem dessa extensão é que você não precisa instalá-la em todas as máquinas de compilation

Eu me deparei com o seguinte artigo, que parece um pouco mais simples, mas eu não tentei isso sozinho.

http://fknut.blogspot.com/2009/11/appconfig-transformation-with-new.html

Além disso, há uma solicitação de recurso no MS Connect que pode valer a pena votar, então isso será incluído em toda a placa no próximo SP ou versão.

https://connect.microsoft.com/VisualStudio/feedback/details/564414

Eu resolvo este problema com esta ferramenta http://ctt.codeplex.com/ . Eu uso com o script CCNet / nAnt para fazer pacotes.

Apenas uma pequena melhoria para a solução que parece estar postada em todos os lugares agora:

  
  • ou seja, a menos que você esteja planejando ficar com sua versão atual do VS para sempre

Então acabei adotando uma abordagem ligeiramente diferente. Eu segui os passos de Dan no passo 3, mas adicionei outro arquivo: App.Base.Config. Este arquivo contém as configurações desejadas em cada App.Config gerado. Então eu uso BeforeBuild (com a adição de Yuri para TransformXml) para transformar a configuração atual com a configuração Base no App.config. O processo de compilation usa o App.config transformado como normal. No entanto, um aborrecimento é que você quer excluir o App.config em constante mudança do controle de origem depois, mas os outros arquivos de configuração agora dependem dele.

      

Eu criei outra alternativa para o postado por Vishal Joshi, onde o requisito para alterar a ação de compilation para o conteúdo é removido e também implementou o suporte básico para a implantação do ClickOnce. Digo básico, porque não testei completamente, mas ele deve funcionar no típico cenário de implantação do ClickOnce.

A solução consiste em um único projeto MSBuild que, uma vez importado para um projeto de aplicativo existente do Windows (* .csproj), estende o processo de compilation para contemplar a transformação app.config.

Você pode ler uma explicação mais detalhada em Visual Studio App.config XML Transformation e o arquivo de projeto MSBuild pode ser baixado do GitHub .

Se você usar um TFS online (versão Cloud) e quiser transformar o App.Config em um projeto, poderá fazer o seguinte sem instalar nenhuma ferramenta extra. From VS => Descarregar o projeto => Editar arquivo de projeto => Ir para o final do arquivo e adicionar o seguinte:

    

AssemblyFile e Destination funciona para uso local e servidor TFS online (Cloud).

A solução proposta não funcionará quando uma biblioteca de classs com o arquivo de configuração for referenciada de outro projeto (no meu caso, foi a biblioteca de projetos do trabalhador do Azure). Ele não copiará o arquivo transformado correto da pasta obj na pasta bin\##configuration-name## . Para fazê-lo funcionar com mudanças mínimas, você precisa alterar o destino BeforeCompile para BeforeCompile :

  

Instale “Configuration Transform Tool” no Visual Studio do Marketplace e reinicie o VS. Você também poderá ver a transformação de visualização do menu para app.config.

https://marketplace.visualstudio.com/items?itemName=GolanAvraham.ConfigurationTransform