在ASP.NET中的开发/ UAT /产品环境之间切换配置的最佳方法?
在开发Web应用程序Development,UAT和Prod时,我需要在3种不同的环境之间切换。我的所有3个配置文件中都有不同的数据库连接。我已经看到通过更改所有引用然后重新构建解决方案来手动切换这些设置,还可以使用预处理器指令来切换。是否有一种简单的方法可以基于某个变量来执行此操作,以便在每次部署到新环境时都不必修改配置?
解决方案
斯科特·汉塞尔曼(Scott Hanselman)提出了一种解决方案:
http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx
在我看来,我们可以从Visual Studio 2005 Web部署项目中受益。
这样,我们可以告诉它根据构建配置来更新/修改web.config文件的各个部分。
请查看Scott Gu的这篇博客文章,以快速获得概述/示例。
我采用了更改配置的Jean Paul Boodhoo方法。
通常的想法是拥有一个或者多个TOKENIZED配置模板文件而不是配置文件本身。然后,我们将拥有一个构建脚本任务,该任务将标记替换为单个本地属性文件中的值。该属性文件包含配置上的所有差异,并且每个工作副本都是唯一的。
该系统对我来说非常有效,并且一旦开始设置就可以轻松管理环境变化。
我非常喜欢使用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文件。
例如
<xmlpoke file =" $ {dist.dir} /Web.config"
xpath =" / configuration / applicationSettings / MyProj.Web.Properties.Settings / setting [@name ='MyProj_Web_Service'] / value"
value =" http:// $ {AppServer} /Service.asmx" />