Visual studio 2010 Visual studio 2010-每个开发人员/machine/environment Web.Config设置

Visual studio 2010 Visual studio 2010-每个开发人员/machine/environment Web.Config设置,visual-studio-2010,msbuild,post-build-event,Visual Studio 2010,Msbuild,Post Build Event,想在这里挑选那些MS构建/VS构建后的倡导者的大脑 我希望每个用户/机器/环境都可以自定义我的web.config条目 我可以在web.config中标记我的可配置/可更改条目,并希望这些条目被相应的用户/环境文件覆盖,并且希望有一个顺序来决定在多个文件中找到条目时哪些条目应优于其他条目 例如:web.config有一个$connectionstring条目,每个用户/环境的自定义文件可能具有替换$connectionstring的潜在值,具体取决于构建解决方案的上下文/配置 也就是说,我可以有

想在这里挑选那些MS构建/VS构建后的倡导者的大脑

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

我可以在web.config中标记我的可配置/可更改条目,并希望这些条目被相应的用户/环境文件覆盖,并且希望有一个顺序来决定在多个文件中找到条目时哪些条目应优于其他条目

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

也就是说,我可以有一组文件,如下所示:

用户_joe.config

       $connectionstring = db_where_joe_like_to_connect_to 
staging.config

       $connectionstring = db_where_staging_connect_to  
production.config

       $connectionstring = db_production
因此,如果joe是从他的Dev box编译解决方案,那么web.config的$connectionstring值应为“db_where_joe_like_to_connect_to”

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


希望有人能给我指点

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

这将允许每个开发人员拥有web.config的一部分,该部分可以合并到他们的构建设置中

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

添加BeforeBuild目标 So-从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> xcopy“$(SolutionDir)Web.$(Configuration.config.transformed”“$(SolutionDir)Web.config”/R/Y
正如Adam在回答中所说,您可以使用web.config转换来实现这一点。基本上,您必须为每个环境创建一个新的解决方案配置。请注意,为每个开发人员提供一个可能很快就会变得不可维护,因为每个配置/平台组合都可以有自己的构建设置

此外,转换仅在网站打包(调用包目标)期间应用。因此,如果您试图使用此功能,以便joe和sally可以在他们自己的计算机上进行不同的配置,那么这对您来说是行不通的


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

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

您可以这样做:

<connectionStrings configSource="myLocalConnectionStrings.cfg" />


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

以下是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")));  
}
#>


同意,个性化配置可能会造成维护混乱,但我们的团队很小,我希望他们也知道自己在做什么:)好的,还要记住,开发人员必须为改造打包项目,然后安装它。因此,这些转变无助于日常发展。这是一个糟糕的建议。你是说如果你有20个开发人员,你应该创建20个不同的构建目标x构建类型的数量?那是一场维护噩梦。哎哟。糟糕的建议还是难懂的特征?如果你有更好的方法,我们会接受更好的建议,否则我会考虑改写为“那是不幸的”。如果您希望在发布期间发生这种情况,那么这很容易。不幸的是,仅仅为了一个构建,额外的步骤就发生了。Mystere-也假设您阅读了下面的评论,您是多个开发人员?@AdamTuliper-我有一个更好的解决方案,它缺少“不幸”方面。如果我错了,请纠正我,但这不会覆盖主Web.config文件吗?那么,将来的任何转换都将基于新转换的Web.config?可能会搞得一团糟吗?我喜欢连接字符串,但当您在没有自定义配置提供程序的情况下处理其他设置(应用程序设置、日志配置等)时,除了转换或…,还有其他选择吗?@AdamTuliper-它适用于web.config中的任何内容。我认为它只适用于部分,而不是个别条目。因此,您必须在本地版本中包含所有条目。仅供参考,您可以在该部分中包含内部内容,但它将被忽略。这为您创建自定义文件提供了一个很好的模板。