开发者

Visual studio 2010 - Per Developer/machine/environment Web.Config settings

开发者 https://www.devze.com 2023-03-05 08:39 出处:网络
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.

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 $connections开发者_开发知识库tring.

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

hope someone can throw pointers.


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>



I would suggest using the configSource attribute in the web.config entries for debug builds. Then, in your test and releae builds you can use data transformations to insert the testing and production entries.

You would do something like this:

<connectionStrings configSource="myLocalConnectionStrings.cfg" />

Then you have a local file called myLocalConnectionStrings that you don't check into source control. In your Web.config.Release you simply transform the connectionStrings section to include the production strings and remove the configSource attribute.


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.


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")));  
}
#>
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号