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行爲。
相關問題