2

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

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

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

按下 F5 按钮(!)我想:

  • 如果 构建配置为Debug ,则使用项目属性中的连接字符串部署项目。
  • 如果构建配置为 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 按钮”下进行了描述:)

4

1 回答 1

3

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

因此,如果我们将这样一个带有 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 行为。
于 2013-02-26T07:49:46.933 回答