想在这里挑选那些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的解决方案。
希望有人可以投掷指针。
答案 0 :(得分:7)
您可以使用visual studio 2010的web.config转换设置。
这将允许每个开发人员拥有他们可以合并为其构建设置的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部分以包含生产字符串并删除configSource属性。
答案 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")));
}
#>