0

私のプロジェクトには、次の 2 つのインポート ステートメントがあります。

<Import Project="<TransformConfigLocation>" />
<Import Project="<PackageLocation>" />

各ターゲットには、次のように定義されたプロパティ グループがあります。

<PropertyGroup>
    <BuildDependsOn>
        $(BuildDependsOn);
        TransformConfig
    </BuildDependsOn>
</PropertyGroup>

<PropertyGroup>
    <BuildDependsOn>
        $(BuildDependsOn);
        Package
    </BuildDependsOn>
</PropertyGroup>

TransformConfig が常にパッケージの前に実行されることを保証したいと思います。私はどちらの依存ターゲットも制御しておらず、NuGet 経由でこれらのターゲットを更新するたびにそれらの編集が消去されるため、それらを明示的に編集する必要はありません。Package ターゲットは一貫して最初に実行されますが、これは望ましくありません。

これは可能ですか?

4

2 に答える 2

2

プロジェクト内のビルド順序は、MSBuildターゲットのビルド順序規則に従うことが保証されています。ここには競合状態はなく、すべてがシリアル化されています。上記のリンクからの引用:

<Target Name="Serve" DependsOnTargets="Chop;Cook" />

Serve ターゲットが Chop ターゲットと Cook ターゲットに依存することを MSBuild に伝えます。MSBuild は Chop ターゲットを実行し、次に Cook ターゲットを実行してから、Serve ターゲットを実行します。

"Serve" の前に実行される他のターゲットが Chop/Cook ターゲットのいずれかを依存関係として持っている場合、またはそれらを BeforeTargets/AfterTargets にリストしていた場合、順序に影響する可能性があることに注意してください。たとえば、次のターゲット セットがあるとします。

 <Target Name="One" DependsOnTargets="Two;Three" />
 <Target Name="Two" DependsOnTargets="TargetB" />
 <Target Name="Three" DependsOnTargets="TargetA;TargetB;" />

「One」をビルドすると、ビルド順序は次のようになります。

TargetB
Two
TargetA
// skip TargetB because it was already run
Three
One

したがって、あなたの場合、TargetB が以前のターゲットの依存関係としてリストされていないと仮定すると、 $(BuildDependsOn) リストは、ターゲットがそこにリストされている順序で実行されます ...;TargetA;TargetB

于 2012-08-22T15:50:09.613 に答える
0

簡単な答えは、インポートの順序重要であるということです。理由の詳細については、@Seva Titov の回答とフォローアップの会話を参照してください。

このトピックに関する徹底的な分析については、http://amzn.com/0735645248を強くお勧めします。

于 2012-08-22T19:19:58.817 に答える