2

Visual Studio 2012. SQL Server数据库项目。MSBuild和SQL Server数据库项目:将部署和发布Desination绑定到构建配置

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

三个发布配置文件是在项目中创建的:(!)DevDb.publish.xml,TestDb.publish.xml,LocalDb.publish.xml

推F5键我想:

  • 部署项目从项目属性的连接字符串如果 生成配置是调试
  • 发布项目,连接字符串 从相应的发布配置如果构建配置是 DevDbTESTDB的LocalDB

要做到这一点,我编辑项目(.sqlproj)XML,试图赶上部署目标的呼叫,并用自定义行为取代非标准部署目标:

<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按钮”:)

回答

3

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

所以,如果我们把这样的PropertyGroup与条件和一个自定义目标数据库项目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行为。