有人知道在不同的构建/部署环境之间管理Web.Config个文件的好工具/实用程序吗?

例如,我有一个WCF项目,在开发中我不想启用SSL,但我确实希望在生产中启用它.我想要不同的日志(log)设置,不同的数据库连接字符串,不同的错误处理,不同的文件路径...甚至还有一些不同的Unity框架绑定(用于单元测试的连接模型,而不是用于部署的真实对象).

维护Web.Config的单个副本是一件痛苦的事情,因为添加新的Web服务意味着编辑多个文件并使它们保持同步.

我还注意到,如果你手工处理了太多的Web.Config个项目,那么如果你试图使用"添加项目"向导,比如说,为WCF添加一个新的Web服务,Visual Studio就会窒息,因为它必须修改Web.配置以添加端点,但无法再解析它.所以我必须小心不要使现有的网络失效.配置.

我还考虑过使用一些正则表达式进行替换,并在预构建命令中构建一个新的Web.Config.这似乎是目前为止最好的 Select ...

还有别的主意吗?这似乎应该是一个非常常见的问题,因为在开发和生产部署之间,Web.Config可能永远不会相同.


Update:

我决定编写一个快速的控制台应用程序,它将获取给定目录中的所有XML文件并将它们合并到一个目录中,并且只包含基于名称的特定文件.

所以我可以在一个目录中:

WebConfig_All

<configuration>
  <configSections>
    ...
  </configSections>
  <system.web>
    ...
  </system.web>
</configuration>

connectionStrings_Debug

<configuration>
  <connectionStrings>
    <add name="connstr" connectionString="...dev..." />
  </connectionStrings>
</configuration>

connectionStrings_Release

<configuration>
  <connectionStrings>
    <add name="connstr" connectionString="...prod..." />
  </connectionStrings>
</configuration>

然后运行我的命令行工具,并传入配置(调试、发布、自定义…)

所以现在我有80%的网络.在单个WebConfig_All个文件中进行配置,每个构建配置的20%自定义内容在单独的文件中.然后,我可以在VisualStudio中作为预构建任务运行命令行工具,也可以从NAnt或任何我想运行的地方运行命令行工具...

我还使我的XML合并逻辑足够好,可以处理以下内容:

<x>
  <y a="1">
    <z a="1"/>
  </y>
</x>

合并

<x>
  <y a="1">
    <z a="2"/>
  </y>
  <y a="2"/>
</x>

结果如下:

<x>
  <y a="1">
    <z a="1"/>
    <z a="2"/>
  </y>
  <y a="2"/>
</x>

到目前为止看起来不错……:)


Followup:

这个话题现在已经有点过时了,所以我想指出VisualStudio 2010有一个功能可以做web.配置转换内置:http://msdn.microsoft.com/en-us/vstudio/Video/ff801895

当然,在微软典型的只实现50%功能的方式中,它只适用于使用WebDeploy的web项目.这里有一个插件可以在其他项目中启用转换:http://www.hanselman.com/blog/SlowCheetahWebconfigTransformationSyntaxNowGeneralizedForAnyXMLConfigurationFile.aspx

您还可以使用像BuildMaster这样的工具来管理配置文件(以及构建、测试、数据库脚本等)

推荐答案

我们将所有特定于区域的设置拆分为他们自己的配置文件.在web应用的根目录下,我们创建一个配置文件夹,并将特定于区域的设置放在那里.因此,config根目录下的所有文件都将被提取.

我们的网络.配置看起来像:

.
.
.
<appSettings configSource="config\appSettings.config"/>
<nlog configSource="config\nlog.config"/>
<applicationSettings>
    <MyApp.UI.Properties.Settings configSource="config\Settings.APGUI.config"/>
    <MyApp.BusinessServices.Properties.Settings configSource="config\Settings.Business.config"/>
    <MyApp.Auditing.Properties.Settings configSource="config\Settings.Auditing.config"/>
</applicationSettings>
.
.
.

因此,如果我们要部署到发布区域,构建工具将只有一个操作,用适当区域文件夹中的文件替换config根目录中的文件.文件 struct 类似于:

添加:这是源代码控制 struct 的样子,部署的应用程序只有config目录,没有子文件夹或课程

\Root
   web.config    
   \Config    
       appsettings.config    
       services.config    
       logging.config    
       \release    
          appsettings.config    
          services.config    
          logging.config    
       \debug
          appsettings.config    
          services.config    
          logging.config

它非常干净,任何自动构建工具(复制/替换文件)都支持它.好的副作用是开发人员可以创建不同的风格,并将它们保持在源代码控制之下,而不会影响"真正的"配置.

Asp.net相关问答推荐

无法在Microsoft Windows Server 2016(数据中心)上运行.NET可移植性分析器

如何在 C# 中生成一个随机的 10 位数字?

此版本的 SQL Server 不支持用户实例登录标志.连接将关闭

log4net 记录所有未处理的应用程序错误

在 ASP.NET 中访问没有值的查询字符串参数

IIS 6/ASP.NET Windows 身份验证 list ?

正在检索组件的 COM 类工厂......错误:80070005 访问被拒绝. (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))

如何更改 .ASPX 自动格式化设置 (Visual Studio)

使用 JSON.NET 解析 json 字符串

从 JavaScript 读取 web.config

asp.net cookie、身份验证和会话超时

如何在asp.net mvc的html.actionlink中调用javascript函数?

如何获取 ActionLink 的工具提示?

如何设置默认页面 asp.net

如何将枚举类型绑定到 DropDownList?

如何忽略身份框架的魔力,只使用 OWIN 身份验证中间件来获取我寻求的声明?

ASP.NET MVC Url Route 支持(点)

错误请求 - 无效的主机名 ASP.net Visual Studio 2015

避免将重复元素添加到列表 C#

如何使用 WebAPI 处理图像