Does anyone know of any good tools/utilities for managing Web.Config files between different build/deployment environments?
For example, I have a WCF project that in development I don't want to enable SSL, but I do want it enabled in production. I want different logging settings, different DB connection strings, different error handling, different file paths... Even some different Unity framework bindings (wire up mocks for unit testing instead of the real objects for deployment).
Maintaining individual copies of the Web.Config is a pain, because adding a new web service means editing multiple files and keeping them in sync.
I've also noticed that if you muck with the Web.Config too much by hand, Visual Studio will choke if you try to use the "add item" wizard to, say, add a new Web Service for WCF, since it has to modify the Web.Config to add the endpoint,a nd can't parse it any more. So I have to be careful not to invalidate the existing Web.Config.
I also thought about just using some regex to do replacements and just building a new Web.Config in a pre-build command. That seems like the best option so far...
Any other ideas? It seems like this should be a very common issue, since the Web.Config should probably never be the same between development and production deployments.
Update:
I decided to write a quick console app that will take all the xml files in a given directory and merge them into one, and only include certain files based on the name.
So I can make in a directory:
WebConfig_All
<configuration>
<configSections>
...
</configSections>
<system.web>
...
</system.web>
</configuration>
connectionStrings_Debug
<configuration>
<connectionStrings>
<add name="connstr" connectionString="...dev..." />
</connectionStrings>
</configuration>
connectionStrings_Release
<configuration>
<connectionStrings>
<add name="connstr" connectionString="...prod..." />
</connectionStrings>
</configuration>
Then run my command line tool, and pass in the configuration (Debug, Release, custom...) And it will merge all the files that end in "All" or "<configuration>".
So now I have 80% of my Web.Config in a single WebConfig_All file,a nd the 20% custom stuff in seperate files per build configuration. I can then run my command line tool as a pre-build task in VisualStudio, or from NAnt, or wherever I want...
I also made my XML merge logic good enough to handle stuff like:
<x>
<y a="1">
<z a="1"/>
</y>
</x>
merge with
<x>
<y a="1">
<z a="2"/>
</y>
<y a="2"/>
</x>
results in:
<x>
<y a="1">
<z a="1"/>
<z a="2"/>
</y>
<y a="2"/>
</x>
Looking good so far... :)