在开发网页应用程序时,我需要在三个不同的环境之间进行切换 - 开发环境、UAT环境和生产环境。我在所有三个环境的配置文件中有不同的数据库连接。我看到过通过手动更改所有引用然后重新构建解决方案来切换这些设置的方法,也看到了使用预处理器指令的方法。是否有一种简单的基于某个变量的方法来实现这一点,这样每次部署到新环境时就不必修改配置呢?
在开发网页应用程序时,我需要在三个不同的环境之间进行切换 - 开发环境、UAT环境和生产环境。我在所有三个环境的配置文件中有不同的数据库连接。我看到过通过手动更改所有引用然后重新构建解决方案来切换这些设置的方法,也看到了使用预处理器指令的方法。是否有一种简单的基于某个变量的方法来实现这一点,这样每次部署到新环境时就不必修改配置呢?
在我看来,您可以从Visual Studio 2005 Web Deployment Project中受益。
通过使用它,您可以告诉它根据构建配置更新/修改web.config文件中的部分内容。
请参阅Scott Gu的这篇博客文章,了解快速概述/示例。
我会保留这些任务:
<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文件。
例如:
<xmlpoke file="${dist.dir}/Web.config" xpath="/configuration/applicationSettings/MyProj.Web.Properties.Settings/setting[@name = 'MyProj_Web_Service']/value" value="http://${AppServer}/Service.asmx" />
Scott Hanselman提出了一种方法:
http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx
这篇文章介绍了如何通过使用预构建事件来管理多个配置文件环境。我采用了Jean Paul Boodhoo Method来改变配置。 总的想法是使用一个或多个TOKENIZED配置TEMPLATE文件,而不是配置文件本身。然后,您可以有一个构建脚本任务,将令牌替换为来自单个本地属性文件的值。此属性文件包含所有配置差异,并且每个工作副本都是唯一的。
这个系统对我来说非常有效,一旦最初设置完成后,管理环境变化就轻而易举。