2

VisualStudio2012。SQLServerデータベースプロジェクト。

ソリューションには、Debug、DevDb、TestDb、LocalDbの4つのビルド構成が作成されました。

プロジェクトには、DevDb.publish.xml、TestDb.publish.xml、LocalDb.publish.xmlの3つの公開プロファイルが作成されました。

F5ボタンを押す(!)

  • ビルド構成がDebugの場合は、プロジェクトプロパティの接続文字列を使用してプロジェクトをデプロイします。
  • ビルド構成が DevDbTestDb、またはLocalDbの場合、対応する公開プロファイルからの接続文字列を使用してプロジェクトを公開します

これを行うには、プロジェクト(.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> 

2番目のステートメントは正常に機能し、適切な宛先にデプロイできます。

問題は最初のステートメントにあります-それは循環依存を生成します。

エラーMSB4006:ターゲット「Deploy」を含むターゲット依存関係グラフに循環依存関係があります。

私の質問は、標準ターゲットを交差させる(キャッチして置き換える)方法と、標準ターゲットを再度呼び出す必要があるかどうかです。

それとも、私は車輪の再発明を試みていますか?私がやりたいことをする別の方法がありますか?(私が欲しいのは、上記の「F5ボタンを押す」という言葉で説明されています:)

4

1 に答える 1

3

私は解決策を持っていると思います。

したがって、そのような PropertyGroup を Condition およびカスタム 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>

次の動作が得られます。

  • ソリューション ビルド構成がデバッグとは異なり、発行プロファイル *.publish.xml が存在する場合、Deploy ターゲットと操作は SqlPublish ターゲットに置き換えられ、この発行操作は、対応する発行プロファイルから接続文字列などの必要な構成を取得します。 .
  • ソリューション ビルド構成がデバッグの場合、プロジェクト プロパティから接続文字列を取得するときに、標準の Visual Studio の動作が維持されます。
于 2013-02-26T07:49:46.933 に答える