Visual Studio 2010 - 每个开发人员/机器/环境Web.Config设置

时间:2011-05-10 17:03:44

标签: visual-studio-2010 msbuild post-build-event

想在这里挑选那些MS Build / VS Post构建指数的大脑。

我希望每个用户/机器/环境都可以自定义我的web.config条目。

我可以在web.config中标记我的可配置/可更改条目,并希望这些条目被相应的用户/环境文件覆盖,并希望有一个命令,如果找到条目,则决定哪些条目应该胜过另一个条目在多个文件中。

例如:web.config有一个$ connectionstring条目,每个用户/环境的自定义文件可能有替换$ connectionstring的潜在值,具体取决于构建解决方案的上下文/配置

这意味着,我可以拥有一组如下文件:

user_joe.config

       $connectionstring = db_where_joe_like_to_connect_to 

staging.config

       $connectionstring = db_where_staging_connect_to  

production.config

       $connectionstring = db_production

所以如果joe正在从他的开发框中编译解决方案,那么web.config应该为$ connectionstring提供值“db_where_joe_like_to_connect_to”。

我希望可能有一个不涉及Nant的解决方案。

希望有人可以投掷指针。

4 个答案:

答案 0 :(得分:7)

您可以使用visual studio 2010的web.config转换设置。

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

这将允许每个开发人员拥有他们可以合并为其构建设置的web.config部分。

在内部,我们使用从网络上的不同位置拼凑在一起的事件 - 因为通常这在发布期间发生,我们希望它在编译时发生。

添加BeforeBuild目标 所以 - 来自csproj文件:

<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>


答案 1 :(得分:2)

我建议在web.config条目中使用configSource属性进行调试构建。然后,在您的测试和版本构建中,您可以使用数据转换来插入测试和生产条目。

你会做这样的事情:

<connectionStrings configSource="myLocalConnectionStrings.cfg" />

然后你有一个名为myLocalConnectionStrings的本地文件,你不检查源代码控制。在您的Web.config.Release中,您只需转换connectionStrings部分以包含生产字符串并删除co​​nfigSource属性。

答案 2 :(得分:1)

正如Adam在他的回答中所说,你可以使用web.config转换来做到这一点。基本上,您必须为每个环境创建新的解决方案配置。请注意,为每个开发人员设置一个可能会很快变得无法管理,因为每个配置/平台组合都可以拥有自己的构建设置。

此外,转换仅在网站打包期间应用(调用包目标)。因此,如果您正在尝试使用它,以便joe和sally可以在自己的计算机上使用不同的配置,那么这对您来说不会那样。

在这种情况下,你可能最好不要让每个人都使用相同的配置,而不是让配置碎片。每个环境之间的差异越大,您部署的难度就会越大。

答案 3 :(得分:0)

这是一个T4解决方案。这适用于我的情况,因为这是一个只供开发人员使用的内部工具,因为我不需要对“包含”文件进行进一步处理。

文件名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")));  
}
#>