9

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

我想为每个用户/机器/环境定制我的 web.config 条目。

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

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

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

user_joe.config

       $connectionstring = db_where_joe_like_to_connect_to 

暂存配置

       $connectionstring = db_where_staging_connect_to  

生产配置

       $connectionstring = db_production

因此,如果 joe 从他的开发框中编译解决方案,则 web.config 应该具有 $connectionstring 的值“db_where_joe_like_to_connect_to”。

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

希望有人可以指点。

4

4 回答 4

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 文件:

<目标名称="BeforeBuild">
    <TransformXml Source="$(SolutionDir)Web.config" Transform="$(SolutionDir)Web.$(Configuration).config" Destination="$(SolutionDir)Web.$(Configuration).config.transformed" />
  </目标>
  <属性组>
    <PostBuildEvent>xcopy "$(SolutionDir)Web.$(Configuration).config.transformed" "$(SolutionDir)Web.config" /R /Y</PostBuildEvent>
  </属性组>


于 2011-05-10T17:12:37.587 回答
2

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

你会做这样的事情:

<connectionStrings configSource="myLocalConnectionStrings.cfg" />

然后,您有一个名为 myLocalConnectionStrings 的本地文件,您没有将其签入源代码管理。在您的 Web.config.Release 中,您只需转换 connectionStrings 部分以包含生产字符串并删除 configSource 属性。

于 2012-02-28T22:00:29.510 回答
1

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

此外,转换仅在网站打包期间应用(调用 Package 目标)。因此,如果您尝试使用它以便 joe 和 sally 可以在他们自己的机器上拥有不同的配置,这不会为您做到这一点。

在这种情况下,您最好尝试让每个人都使用相同的配置,而不是让配置碎片化。每个环境之间的差异越大,部署的时间就越困难。

于 2011-05-10T17:20:38.573 回答
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")));  
}
#>
于 2016-04-08T20:44:29.497 回答