如何创建一个通用的Web.config文件和一堆特定的Web.config文件?

时间:2011-02-16 00:39:22

标签: asp.net version-control configuration

上下文

目前,我在一个ASP.NET项目上工作,该项目在版本控制下托管,并在几个开发人员机器,测试机器和生产环境中使用。

在三种情况下,配置(Web.config)可能不同。例如,开发人员和测试人员环境使用测试SQL Server,而在生产环境中,访问另一个SQL Server,因此在这些情况下连接字符串是不同的。

我们希望在subversion中保留三个版本的Web.config。但是每次我们需要添加,删除或更改常用设置时,修改三个文件中的每一个都很烦人:拥有一个通用的主Web.config会很好,这将由三个Web中的每一个继承。配置文件

问题

如何设置一个ASP.NET项目,该项目将在不同的机器上使用主配置文件和不同的从属配置文件,从而在subversion中共享相同的项目/源代码/配置文件?

如果.NET Framework无法做到这一点,有哪些替代方案(如果需要构建自定义解决方案,可以避免重新发明轮子和/或查看其工作原理)?

2 个答案:

答案 0 :(得分:2)

Visual Studio 2010具有此功能,称为“web.config转换”。您有一个基本的web.config,然后,对于每个配置,您都有转换文件,可以有效地“编辑”特定环境的基本web.config。

默认Web.Debug.config文件中的示例:

<?xml version="1.0"?>

<!-- For more information on using web.config transformation
  visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an atrribute "name" that has a value of "MyDB".

    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->
  <system.web>
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.

      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
</configuration>

答案 1 :(得分:2)

如果我今天开始,VS 2010的web.config转换功能绝对值得一看。但是我必须在工具支持可用之前解决这个问题,我也认为变换很好,但有时他们只是不切割芥末 - 特别是如果你有很多大量配置驱动的东西或生产配置可以改变没有开发团队了解它。

我们如何处理这个问题是为了保留配置的单独副本。存储在项目根目录中的是我们的标准化开发环境。它也被设置为“内容”文件,不会复制到输出文件夹。从视觉工作室的角度来看环境存储在项目之外,但仍然在相同的版本控制中,在每个环境和方面的文件夹中(我们有许多带有单独管理工具的多头网络应用程序)。我们使用构建脚本将所有内容绑定在一起,该脚本根据声明的环境复制正确的配置。

我们发现这比实际中的变换要好得多 - 主要的是生产配置是如此不同,以至于可能有比配置更多的变换。还允许我们保持生产配置同步,因为它实际上只是一个文件副本,而不是一些可怕的XSLT的更新。