How to add config transformations for a custom config file in Visual Studio? How to add config transformations for a custom config file in Visual Studio? asp.net asp.net

How to add config transformations for a custom config file in Visual Studio?


Visual Studio transforms only web.config files by default.

If you need custom config file with transformation for DEV, UAT, PROD, etc environments, then try to

  1. Use custom extensions for Visual Studio like SlowCheetah - XML Transforms for Config transformation preview functionality.
  2. Add for the project from Nuget SlowCheetah to provide build in transformation.

A little bit details:

Add VS Extension SlowCheetah from Extensions and UpdatesScreen of Extensions and Updates

Right click on your myconfig.config and choose add transorm:Screen of Extensions and Updates

Inside each defined configurations insert your own transormation rulles like that:

<services xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">  <service name="WebApplication1.Services.Service2" xdt:Transform="Replace" xdt:Locator="Match(name)" >    <endpoint address="http://localhost:57939/Services/DebugService" behaviorConfiguration="WebApplication1.Services.Service2AspNetAjaxBehavior"      binding="webHttpBinding" contract="WebApplication1.Services.Service2" />  </service></services>

Hope it was helpful


I'm going to extend on Andoni Ripoll Jarauta's answer a little.

We were faced with a similar problem. I wanted to pull the connection strings out of the web.config file to limit merge conflicts. I also wanted create a "release" config containing static information when publishing.

...simple enough. Create a custom config file, webdb.config, and update the web.config file.

Ex.web.config

<connectionStrings configSource="WebDB.config"/>

wedbdb.config (xml version="1.0" is required for transformation)

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

Next add transformation files for webdb.config

enter image description here

WebDB.Debug.config example:

<?xml version="1.0" encoding="utf-8"?><connectionStrings xdt:Transform="Replace" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">    <add name="PRRADDataContainer" connectionString="metadata=~/PRRADData.csdl|~/PRRADData.ssdl|~/PRRADData.msl;provider=System.Data.SqlClient;provider connection string=';Data Source=localhost;Initial Catalog=;User ID=;Password=;multipleactiveresultsets=True;App=EntityFramework';" providerName="System.Data.EntityClient" />    <add name="MyConnectionString" connectionString="Data Source=localhost;Initial Catalog=;Persist Security Info=True;User ID=;Password=;" providerName="System.Data.SqlClient" /></connectionStrings>

WebDB.Release.config example:

<?xml version="1.0" encoding="utf-8"?><connectionStrings xdt:Transform="Replace" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">    <add name="PRRADDataContainer" connectionString="metadata=~/PRRADData.csdl|~/PRRADData.ssdl|~/PRRADData.msl;provider=System.Data.SqlClient;provider connection string=';Data Source=prod_server;Initial Catalog=;User ID=;Password=;multipleactiveresultsets=True;App=EntityFramework';" providerName="System.Data.EntityClient" />    <add name="MyConnectionString" connectionString="Data Source=prod_server;Initial Catalog=;Persist Security Info=True;User ID=;Password=;" providerName="System.Data.SqlClient" /></connectionStrings>

Next we need to add an after-build event. This is created by simply editing the CSPROJ file.

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" /><Target Name="AfterBuild">    <TransformXml Source="WebDB.config" Transform="WebDB.$(Configuration).config" Destination="WebDB.config" /></Target>

Now when I run locally I'll get WebDB.Debug.config and when I publish my code I just need to make sure to select "Release" as the configuration source. In both cases the WebDB.config file will be updated with the corresponding file when you build.

NOTE: make sure you set the webdb.config, webdb.debug.config, and webdb.release.config to "Do not copy" for the "Copy to Output Directory" option.

Hope this helps!


There is another approach that doesn't require installing extensions nor using build events.

Let's suppose you have your custom configs like so:

  • myConfig.config
  • myConfig.Uat.config
  • myConfig.Release.config

Then in your main Web.config you have this:

<mySection configSource="myConfig.config" />

Lastly, inside your Web.Uat.config you add a transform like this:

<mySection configSource="myConfig.Uat.config" xdt:Transform="SetAttributes" />

This is not transforming the myConfig.config file, but rather overriding the name of the custom config file that should be used. You can do the same for the Release and any other environments.

Your myConfig.Uat.config should not contain transformations, it should be a copy of the base custom config file, with the appropriate values for the custom environment.

The downside is everytime you add something to the base custom config file, you need to also add to the config files for other envs (even if the value should be the same through envs). So I'd consider just using these custom config files for settings that should be changed between envs.