【发布时间】:2010-09-13 01:42:01
【问题描述】:
在开发我的网络应用程序时,我需要在 3 个不同的环境之间切换 - 开发、UAT 和生产。我的所有 3 个配置文件中都有不同的数据库连接。我已经看到通过更改所有引用然后重新构建解决方案来手动完成这些设置的切换,并且还使用预处理器指令完成。有没有一种简单的方法可以根据一些变量来执行此操作,以便每次部署到新环境时都不必修改配置?
【问题讨论】:
标签: asp.net configuration
在开发我的网络应用程序时,我需要在 3 个不同的环境之间切换 - 开发、UAT 和生产。我的所有 3 个配置文件中都有不同的数据库连接。我已经看到通过更改所有引用然后重新构建解决方案来手动完成这些设置的切换,并且还使用预处理器指令完成。有没有一种简单的方法可以根据一些变量来执行此操作,以便每次部署到新环境时都不必修改配置?
【问题讨论】:
标签: asp.net configuration
在我看来,您似乎可以从Visual Studio 2005 Web Deployment Projects 中受益。
这样,您可以告诉它根据构建配置更新/修改 web.config 文件的部分。
查看this blog entry from Scott Gu 以获得快速概览/示例。
【讨论】:
我非常喜欢使用 MSBuild,尤其是 MSBuild 社区任务 (http://msbuildtasks.tigris.org/),并且有一个 XSLT 任务可以使用适当的连接字符串设置等转换 web.config。
我把这些任务放在手边:
<Target Name="Configs">
<Xslt RootTag="" Inputs="web.config" Output="Web.$(COMPUTERNAME).config" Xsl="web.config.$(COMPUTERNAME).xslt" Condition="Exists('web.config.$(COMPUTERNAME).xslt')" />
显然,这不是 100% 你所追求的,这样每个开发人员都可以拥有自己的 web.config。
但您没有理由不能使用上述原则来拥有应用正确 XSLT 的多个构建配置。
我的 XSLT 如下所示:
<?xml version="1.0" encoding="utf-8"?>
<!-- Dev -->
<xsl:template match="/configuration/connectionStrings/add[@name='MyConnectionString']/@connectionString">
<xsl:attribute name="connectionString">Data Source=MyServer;Initial Catalog=MyBD;User ID=user;password=pwd</xsl:attribute>
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
【讨论】:
您始终可以在构建过程中使用 NAnt + NAnt.Contrib 来修改 web.config。 NAnt 有 xmlpeek 和 xmlpoke 任务,可以让你更新 xml 文件。
例如
【讨论】:
Scott Hanselman 提出了一种方法:
http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx
【讨论】:
我采用了更改配置的Jean Paul Boodhoo Method。 总体思路是拥有一个或多个 TOKENIZED 配置模板文件,而不是配置文件本身。然后,您有一个构建脚本任务,该任务将标记替换为单个本地属性文件中的值。此属性文件包含配置中的所有差异,并且每个工作副本都是唯一的。
这个系统对我来说非常好用,一旦开始设置,就可以轻松管理环境变化。
【讨论】: