有没有好的工具/实用程序,可以在不同的构建/部署环境之间管理Web.Config
文件?
例如,在开发中我不希望启用SSL,但在生产中我要启用它。 我想要不同的日志记录设置、不同的数据库连接字符串、不同的错误处理、不同的文件路径......甚至一些不同的Unity框架绑定(为单元测试划分模拟对象,而不是为部署划分真正的对象)。
维护Web.Config
的各个副本很麻烦,因为添加新的web服务意味着编辑多个文件并保持它们同步。
我还注意到,如果你通过手动修改 Web.Config
来改得太复杂,当您尝试使用“添加项”向导添加WCF的新Web服务时,Visual Studio会崩溃,因为它必须修改 Web.Config
来添加端点,无法再解析它。所以我必须小心不要使现有的 Web.Config
无效。
我也考虑过只使用一些正则表达式进行替换,并在预建命令中构建一个新的 Web.Config
。这似乎是迄今为止最好的选择...
还有其他想法吗?这似乎应该是一个非常常见的问题,因为在开发和生产部署之间 Web.Config
应该永远不会相同。
更新:
我决定编写一个快速控制台应用程序,将给定目录中的所有xml文件合并成一个文件,并仅根据名称包括某些文件。
所以我可以在一个目录中:
WebConfig_All
<configuration>
<configSections>
...
</configSections>
<system.web>
...
</system.web>
</configuration>
连接字符串_Debug
<configuration>
<connectionStrings>
<add name="connstr" connectionString="...dev..." />
</connectionStrings>
</configuration>
连接字符串_Release
<configuration>
<connectionStrings>
<add name="connstr" connectionString="...prod..." />
</connectionStrings>
</configuration>
然后运行我的命令行工具,并传入配置(Debug、Release、自定义...),它将合并所有以"_All
"或"_<configuration>
"结尾的文件。现在我将80%的Web.Config放在一个名为
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>
看起来目前还不错... :)
跟进:
这个主题现在有点老了,所以我想指出VisualStudio 2010具有内置的执行web.config转换的功能: http://msdn.microsoft.com/en-us/vstudio/Video/ff801895
当然,按照微软一贯的方式,这个功能只对使用Web Deploy的 Web 项目有效。这里有一个插件可以启用其他项目中的转换:http://www.hanselman.com/blog/SlowCheetahWebconfigTransformationSyntaxNowGeneralizedForAnyXMLConfigurationFile.aspx
你也可以使用诸如BuildMaster之类的工具来管理配置文件(以及构建、测试、数据库脚本等)。