有人知道在不同的构建/部署环境之间管理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这样的工具来管理配置文件(以及构建、测试、数据库脚本等)