Asp.net 如何创建一个公共Web.config文件和一组特定的Web.config文件? 上下文

Asp.net 如何创建一个公共Web.config文件和一组特定的Web.config文件? 上下文,asp.net,version-control,configuration,Asp.net,Version Control,Configuration,目前,我在一个ASP.NET项目上工作,该项目是在版本控制下托管的,并在几个开发人员机器、测试人员机器和生产环境上使用 在三种情况下,配置(Web.config)可能不同。例如,开发人员和测试人员环境使用测试SQL Server,而在生产环境中,访问另一个SQL Server,因此在这些情况下连接字符串是不同的 我们希望在subversion中保留三个版本的Web.config。但是每次我们需要添加、删除或更改公共设置时,都要修改三个文件中的每一个,这很烦人:最好有一个公共的主Web.confi

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

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

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

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


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

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>

如果从今天开始,VS 2010的web.config转换功能绝对值得一看。但我必须在工具支持可用之前解决这个问题,我也认为转换很好,但有时它们不能解决问题——特别是如果您有大量配置驱动的内容或生产配置,可以在开发团队不知道的情况下进行更改

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


我们发现这比实际中的转换要有效得多——主要是产品配置差异太大,因此转换可能比配置更多。还允许我们保持生产配置的同步,因为它实际上只是一个文件副本,而不是一些可怕的XSLT的更新。

您使用的是哪个版本的Visual Studio?我很好奇。您在生产中有哪些“变化大于配置”的配置更改?我想我也很惊讶,你将“生产”配置文件保存在源代码管理中——你的生产人员是否检查这些文件?增量来自各种情况,通常是大型日志框架和其他第三方文件,在大多数情况下,这些文件没有连接到开发环境中。生产,至少对我们来说,几乎与项目一起生活在SVN中,只能通过SVN进行生产。我承认这是一个相当疯狂的系统,但我还没有发现任何比这更好的系统。