【问题标题】:MSBuild & SQL Server Database Project: bind the deploy and publish desination to the build configurationMSBuild 和 SQL Server 数据库项目:将部署和发布目标绑定到构建配置
【发布时间】:2013-02-10 18:46:50
【问题描述】:

Visual Studio 2012。SQL Server 数据库项目。

在解决方案中创建了四个构建配置:Debug、DevDb、TestDb、LocalDb。

在项目中创建了三个发布配置文件:DevDb.publish.xml、TestDb.publish.xml、LocalDb.publish.xml

按 F5 按钮 (!) 我想:

  • 部署项目,使用来自项目属性的连接字符串if 构建配置是 Debug
  • 发布带有连接字符串的项目 从相应的发布配置文件 if 构建配置是 DevDbTestDbLocalDb

为此,我编辑项目 (.sqlproj) xml,试图捕捉 Deploy 目标的调用并用自定义行为替换标准 Deploy 目标:

<Target Name="Deploy">     

    <!-- The first statment is for Debug configuration  -->

    <MSBuild Condition=" '$(Configuration)' == 'Debug' "
      Targets="Deploy"
      Projects="$(MSBuildProjectFile)"
      Properties="Configuration=$(Configuration);" 
    />

    <!-- The second statement is for DevDb, TestDb, LocalDb configurations  -->

    <MSBuild Condition=" '$(Configuration)' != 'Debug' "
      Targets="SqlPublish"
      Projects="$(MSBuildProjectFile)"
      Properties="SqlPublishProfilePath=$(Configuration).publish.xml;
                  Configuration=$(Configuration);"
    />       
 </Target> 

第二条语句运行良好,我将部署到正确的目的地。

问题在于第一条语句 - 它产生了循环依赖。

错误 MSB4006:在涉及目标“部署”的目标依赖图中存在循环依赖。

我的问题是:如何与标准目标相交(捕获和替换)以及是否需要再次调用标准目标?

或者我是否正在尝试重新发明轮子并且有另一种方法可以做我想做的事? (我想要的内容在上面的“按下 F5 按钮”下进行了描述:)

【问题讨论】:

    标签: visual-studio-2012 msbuild database-project sql-server-data-tools msbuild-target


    【解决方案1】:

    我想我已经找到了解决方案。

    所以如果我们将这样一个带有 Condition 的 PropertyGroup 和一个自定义 Target 放在数据库项目 xml 文件的末尾:

    <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
    
        ----------- Skip -----------
    
      <PropertyGroup Condition=" '$(Configuration)' != 'Debug' and Exists('$(Configuration).publish.xml')">
        <DeployDependsOn>
          PublishDatabase
        </DeployDependsOn>
      </PropertyGroup>
    
      <Target Name="PublishDatabase"> <!-- Custom Target -->
        <Message 
            Text="Deploy is replaced with SqlPublish for configuration = $(Configuration)"
            Importance="high" />
    
        <MSBuild 
            Targets="SqlPublish" 
            Projects="$(MSBuildProjectFile)"
            Properties="SqlPublishProfilePath=$(Configuration).publish.xml;
                        Configuration=$(Configuration);" />
      </Target>
    </Project>
    

    我们会得到以下行为:

    • 如果解决方案构建配置不同于 Debug 并且发布配置文件 *.publish.xml 存在,则 Deploy 目标和 操作将替换为 SqlPublish 目标和此发布 操作会得到连接等所需的配置 来自相应发布配置文件的字符串。
    • 如果解决方案构建配置是调试,那么当它从项目属性中获取连接字符串时,我们会保留标准的 Visual Studio 行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      相关资源
      最近更新 更多