Configuration Transformation em app.config com visual studio 2015

  • Rafael Miceli
  • 26 Abr 2016

Quando criamos uma aplicação web com asp.net 4.5 podemos ter diferentes web.configs para cada configuration environment. Por default, quando criamos uma nova aplicação temos um Web.debug e um web.release e esses diferentes configs são muito poderosos para temros diferentes valores em diferentes ambientes (Como por exemplo ConnectionString), como podemos aproveitar isso para o app.config?

Xml Transformation

Para aproveitar essa funcionalidade para nossos app.config’s precisamos acessar o csproj da nossa aplicação.

No final dele vamos encontrar um seguinte trecho para tasks.

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
    Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->

O que vamos fazer aqui, vai ser usar a funcionalidade do web.config de Xml transformation no csproj de um console app, afinal, ambos são Xml.

Lembrando que o projeto com este código está em meu Github

Para podermos fazer a transformação, se estiver no visual studio 2015, precisamos adicionar o seguinte trecho de código no csproj logo abaixo do elemtno Import:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterCompile" Condition="Exists('App.$(Configuration).config')">
<!--Generate transformed app config in the intermediate directory-->
<TransformXml Source="App.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="App.$(Configuration).config" />
<!--Force build process to use the transformed configuration file from now on.-->
<ItemGroup>
    <AppConfigWithTargetPath Remove="App.config" />
    <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
    <TargetPath>$(TargetFileName).config</TargetPath>
    </AppConfigWithTargetPath>
</ItemGroup>
</Target>
<!--Override After Publish to support ClickOnce AfterPublish. Target replaces the untransformed config file copied to the deployment directory with the transformed one.-->
<Target Name="AfterPublish">
<PropertyGroup>
    <DeployedConfig>$(_DeploymentApplicationDir)$(TargetName)$(TargetExt).config$(_DeploymentFileMappingExtension)</DeployedConfig>
</PropertyGroup>
<!--Publish copies the untransformed App.config to deployment directory so overwrite it-->
<Copy Condition="Exists('$(DeployedConfig)')" SourceFiles="$(IntermediateOutputPath)$(TargetFileName).config" DestinationFiles="$(DeployedConfig)" />
</Target>

Agora, precisamos criar manualmente nosso app.Debug.config e app.Release.config e adicionar ao projeto:

passo1

Para adicionar em nosso projeto clique em Add… Existing Item… Selecione All Files e adicione os config’s.

passo2

E por fim, para ficar bonito, vamos novamente em nosso csproj e vamos agrupar nossos diferentes configs abaixo de app.config:

<ItemGroup>
    <None Include="App.config" />
    <None Include="App.Debug.config">
        <DependentUpon>App.config</DependentUpon>
    </None>
    <None Include="App.Release.config">
        <DependentUpon>App.config</DependentUpon>
    </None>
</ItemGroup>

Pronto! Temos nosso Xml Transformation funcionando

Facilitando um pouco

Agora que entendemos como funciona s transformação do Xml, ao invés de termos de ficar digitando todo esse código, existe um plugin do Visual Studio que facilita muito nossa vida, que se chama Configuration Transform.

Basicamente com ele podemos adicionar todo o código para o Xml Transformation com poucos clicks.

Atenção ao caminho da dll e a task

Uma atenção que tem que ser observada, é que os exemplos mais famosos na internet são com o visual Studio 2010, então o path da dll Microsoft.Web.Publishing.Tasks.dll muda drasticamente.

Outro ponto importante, é estar atento que apenas o ultimo elemento Target AfterCompile dentro do csproj que vai executar. Então fique de olho, pois caso a transformação não esteja funcionando, verifique o csproj.

comentarios com Disqus Disqus