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>

```
As Adam said in his answer, you can kind of do this using web.config transforms. Basically you'd have to create a new solution configuration for each environment. Note that having one for each developer will likely quickly become unmaintaniable, as each configuration / platform combination can have it's own build settings.

Also, the transforms are ONLY applied during the web site packaging (calling the Package target). So if you're trying to use this so that joe and sally can have different configs on their own machine, this won't do that for you.

In that case you're probably better off trying to get everyone on the same configuration, than allowing configs to fragment. The more differences between each environment, the harder time you'll have deploying.