我正在尝试构建一个MSBuild文件,以便将多个网站部署到多个环境中。目前,我已经构建了该项目,并将其转储到目录中。
我使用变量$(AdminConsoleConfigFilePath)来引用该目录中web.config文件的路径。我的替换文件由变量$(AdminConsoleConfigReplacementFile)表示。我已经在msbuild文件中为该项目设置了以下任务:
<Target Name="AdminConsoleConfig" DependsOnTargets="BuildAdminConsole">
<Message Text="Beginning configuration for AdminConsole at $(AdminConsoleConfigFilePath) using $(AdminConsoleConfigReplacementFile)" Importance="high"/>
<XmlMassUpdate ContentFile="$(AdminConsoleConfigFilePath)" SubstitutionsFile="$(AdminConsoleConfigurationReplacementPath)"
ContentRoot="$(ConfigurationContentReplacementXPathRoot)" SubstitutionsRoot="$(SubstitutionsXPathRoot)"/>
<Message Text="Finished configuration for AdminConsole using $(AdminConsoleConfigReplacementFile)" Importance="high"/>`
这里的其他变量的值声明如下:
<ConfigurationContentReplacementXPathRoot>/configuration</ConfigurationContentReplacementXPathRoot>
<SubstitutionsXPathRoot>/configuration/substitutions/$(Environment)</SubstitutionsXPathRoot>环境是生成目标所在的名称。在这种情况下,它是"qa“。
我的web.config有典型的hibernate-config部分,如下所示:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.isolation">ReadCommitted</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">[redacted]</property>
<property name="show_sql">false</property>
<property name="generate_statistics">true</property>
<property name="current_session_context_class">web</property>
<property name="adonet.batch_size">250</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<mapping assembly="[redacted]"/>
</session-factory>
</hibernate-configuration>我的替换文件如下所示:
<configuration xmlns:xmu="urn:msbuildcommunitytasks-xmlmassupdate">
<substitutions>
<dev></dev>
<qa>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property xmu:key="name" xmu:Transform="Replace" xmu:Locator="Match(name)" name="connection.connection_string">[redacted-qa]</property>
</session-factory>
</hibernate-configuration>
</qa>现在,connection.connection_string属性没有被替换(在上面的代码中,我也无法获得用于配置和替换的结束标记,以便在这个站点的编辑器中显示--这可能是火狐的一个问题)。有什么想法吗?我试过以下几种方法:
将nhibernate的名称空间声明从问题中的individually).
还尝试了使用和不使用xmu:key值(甚至尝试用xmu:Key替换它)。
我真是不知所措。XMLMassUpdate的东西能工作吗?我们希望将web.config的qa和产品版本(或者至少是各种敏感位)排除在代码的主体之外,以防出现初级开发人员或承包商,因此当前的web.qa.config和web.prod.config方法在这一点上并不可行。对于如何实现这一点有什么想法(除了为每个环境保留完整的web.config副本并在构建之后复制)?
谢谢,威尔
发布于 2011-04-02 02:39:05
我本人还没有尝试使用xmlmassupdate方法进行配置替换。但是有一种替代方法,即使用XmlFile/UpdateElement方法在目标中单独指定每个配置更新。
<MSBuild.ExtensionPack.Xml.XmlFile
TaskAction="UpdateElement"
File="$(AdminConsoleConfigFilePath)"
XPath="/hibernate-configuration/session-factory/property[@name='connection.connection_string']"
InnerText="Initial Catalog=MyDatabase;Data Source=$(DatabaseServerInstance)"
/>然后将配置放在目标文件的标题中。
<Choose>
<When Condition="$(Environment)=='DEV'">
<PropertyGroup>
<DatabaseServerInstance>DEVSERVER</DatabaseServerInstance>
</PropertyGroup>
</When>
<When Condition="$(Environment)=='QA'">
<PropertyGroup>
<DatabaseServerInstance>QASERVER</DatabaseServerInstance>
</PropertyGroup>
</When>
<When Condition="$(Environment)=='PROD'">
<PropertyGroup>
<DatabaseServerInstance>PRODSERVER</DatabaseServerInstance>
</PropertyGroup>
</When>
</Choose>您还可以将“选择”块放入一个单独的文件中,并将其包含在目标文件中。我个人更喜欢这种方法,因为它允许我们集中处理特定于环境的属性列表,然后这些属性可以被多个目标文件使用(例如,如果您有多个应用程序要在每个环境中部署使用相同数据库服务器的应用程序)。
https://stackoverflow.com/questions/5481511
复制相似问题