Question: Wanted to pick the brains of those MS Build/ VS Post build exponents here.

I would like to have my web.config entries customizable per user/machine/environment.

I could have my configurable/changeable entries marked in the web.config and would like those entries overridden by the respective user/environment file and would like to have an order that decides which entries should trump the other if the entry is found in multiple files.

for eg: web.config has a $connectionstring entry and the customization files per user/environment could have the potential values to replace $connectionstring depending on the context/configuration the solution is built

which means, I could have a set of files like below:

user\_joe.config 

```
       $connectionstring = db_where_joe_like_to_connect_to 

```

staging.config

```
       $connectionstring = db_where_staging_connect_to  

```

production.config

```
       $connectionstring = db_production

```

so if joe is compiling the solution from his Dev box, the web.config should have the value "db\_where\_joe\_like\_to\_connect\_to" for $connectionstring.

I am hoping there could be a solution that doesn't involve Nant.

hope someone can throw pointers.

Answer: 
You can use visual studio 2010's web.config transform settings.

<http://weblogs.asp.net/gunnarpeipman/archive/2009/06/16/visual-studio-2010-web-config-transforms.aspx>

This will allow each developer to have their portion of a web.config that can get merged in for their build settings. 

Internally we use an event that was pieced together from various places on the net- since normally this happens during publishing and we wanted it to happen at compile time.

Add a BeforeBuild target
So - from the csproj file:

```

<Target Name="BeforeBuild">
    <TransformXml Source="$(SolutionDir)Web.config" Transform="$(SolutionDir)Web.$(Configuration).config" Destination="$(SolutionDir)Web.$(Configuration).config.transformed" />
  </Target>
  <PropertyGroup>
    <PostBuildEvent>xcopy "$(SolutionDir)Web.$(Configuration).config.transformed" "$(SolutionDir)Web.config" /R /Y</PostBuildEvent>
  </PropertyGroup>

```
Here is a T4 solution. This worked for my case because this was an internal tool that would only be used by developers and because I don't need further processing for the "included" files. 

File name App.tt.

```
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".config" #>
<#
string pathToConfigurations = Host.ResolvePath("Configurations");
string pathToMachine = Path.Combine(pathToConfigurations, Environment.MachineName + ".config");
if (File.Exists(pathToMachine))
{
    Write(File.ReadAllText(pathToMachine)); 
}
else
{
    Write(File.ReadAllText(Path.Combine(pathToConfigurations, "App.config")));  
}
#>

```