首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSBuild控制XMLMassUpdate与NHibernate配置

MSBuild控制XMLMassUpdate与NHibernate配置
EN

Stack Overflow用户
提问于 2011-03-30 03:24:25
回答 1查看 624关注 0票数 1

我正在尝试构建一个MSBuild文件,以便将多个网站部署到多个环境中。目前,我已经构建了该项目,并将其转储到目录中。

我使用变量$(AdminConsoleConfigFilePath)来引用该目录中web.config文件的路径。我的替换文件由变量$(AdminConsoleConfigReplacementFile)表示。我已经在msbuild文件中为该项目设置了以下任务:

代码语言:javascript
复制
<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"/>

`

这里的其他变量的值声明如下:

代码语言:javascript
复制
<ConfigurationContentReplacementXPathRoot>/configuration</ConfigurationContentReplacementXPathRoot>
<SubstitutionsXPathRoot>/configuration/substitutions/$(Environment)</SubstitutionsXPathRoot>

环境是生成目标所在的名称。在这种情况下,它是"qa“。

我的web.config有典型的hibernate-config部分,如下所示:

代码语言:javascript
复制
<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>

我的替换文件如下所示:

代码语言:javascript
复制
<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).

  • Adding和替换文件中移除(
  1. 是nhibernate声明的名称空间前缀,并在相关节点和属性的前缀中加上)。同样,在web.config和替换文件上(无论是单独的还是在combination.
  2. Attempted中)都试着使用来自MSBuild控制项目的最新夜间构建。
  3. 尝试使用基于XPath的xmu:Locator。

还尝试了使用和不使用xmu:key值(甚至尝试用xmu:Key替换它)。

我真是不知所措。XMLMassUpdate的东西能工作吗?我们希望将web.config的qa和产品版本(或者至少是各种敏感位)排除在代码的主体之外,以防出现初级开发人员或承包商,因此当前的web.qa.config和web.prod.config方法在这一点上并不可行。对于如何实现这一点有什么想法(除了为每个环境保留完整的web.config副本并在构建之后复制)?

谢谢,威尔

EN

回答 1

Stack Overflow用户

发布于 2011-04-02 02:39:05

我本人还没有尝试使用xmlmassupdate方法进行配置替换。但是有一种替代方法,即使用XmlFile/UpdateElement方法在目标中单独指定每个配置更新。

代码语言:javascript
复制
    <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)" 
    />

然后将配置放在目标文件的标题中。

代码语言:javascript
复制
<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>

您还可以将“选择”块放入一个单独的文件中,并将其包含在目标文件中。我个人更喜欢这种方法,因为它允许我们集中处理特定于环境的属性列表,然后这些属性可以被多个目标文件使用(例如,如果您有多个应用程序要在每个环境中部署使用相同数据库服务器的应用程序)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5481511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档