あるターゲットへの入力が別のターゲットの出力に依存する場合は、ターゲットを並べ替える必要があります。 これらの属性を使用して、ターゲットを実行する順序を指定できます。
。 この 属性は、コマンド ラインまたは 属性でターゲットが指定されている場合でも、最初に実行されるターゲットを指定します。
。 この 属性は、コマンド ラインでターゲットが明示的に指定されていない場合に実行されるターゲットを指定します。
。 この 属性は、このターゲットを実行する前に実行する必要があるターゲットを指定します。
と . これらの 属性は、指定したターゲットの前または後に、このターゲットを実行することを指定します。
一般に、宣言の順序に依存して、他のタスクの前に実行されるタスクを指定しないでください。
ビルド内の後続のターゲットが依存している場合でも、ビルド中にターゲットが 2 回実行されることはありません。 ターゲットが実行されると、ビルドへのその貢献が完了します。
ターゲットは、 属性を持つことができます。 指定した条件が に評価された場合、ターゲットは実行されず、スキップされたと見なされます。 スキップされたターゲットの動作の詳細については、 ターゲットのビルド順序の決定 を参照してください。 条件の詳細については、「 条件」を参照してください。
初期ターゲット
要素の属性は、ターゲットがコマンド ラインまたは 属性で指定されている場合でも、最初に実行されるターゲットを指定します。 最初のターゲットは、通常、エラー チェックに使用されます。
属性の値には、ターゲットのセミコロン区切りの順序付きリストを指定できます。 次の例では、 ターゲットが実行され、 ターゲットが実行されることを指定します。
<Project InitialTargets="Warm;Eject">
インポートされたプロジェクトは、独自の 属性を持つことができます。 すべての初期ターゲットはまとめて集計され、順番に実行されます。
詳細については、「 方法: 最初にビルドするターゲットを指定する」を参照してください。
既定のターゲット
要素の属性は、コマンド ラインでターゲットが明示的に指定されていない場合にビルドされるターゲットを指定します。
属性の値は、既定のターゲットのセミコロン区切りの順序付きリストにすることができます。 次の例では、 ターゲットが実行され、 ターゲットが実行されることを指定します。
<Project DefaultTargets="Clean;Build">
コマンド ラインの -target スイッチを使用して、既定のターゲットをオーバーライドできます。 次の例では、 ターゲットが実行され、 ターゲットが実行されることを指定します。 この方法でターゲットを指定すると、既定のターゲットはすべて無視されます。
msbuild -target:Build;Report
初期ターゲットと既定のターゲットの両方が指定され、コマンド ライン ターゲットが指定されていない場合、MSBuild は最初に初期ターゲットを実行してから、既定のターゲットを実行します。
インポートされたプロジェクトは、独自の 属性を持つことができます。 最初に検出された 属性によって、実行される既定のターゲットが決まります。
詳細については、「 方法: 最初にビルドするターゲットを指定する」を参照してください。
最初のターゲット
初期ターゲット、既定のターゲット、またはコマンド ライン ターゲットがない場合、MSBuild は、プロジェクト ファイルまたはインポートされたプロジェクト ファイルで最初に検出されたターゲットを実行します。
ターゲットの依存関係
ターゲットは、相互の依存関係を記述できます。 属性は、ターゲットが他のターゲットに依存していることを示します。 たとえば、
<Target Name="Serve" DependsOnTargets="Chop;Cook" />
は、 ターゲットが ターゲットと ターゲットに依存することを MSBuild に通知します。 MSBuild は、 ターゲットを実行し、 ターゲットを実行する前に ターゲットを実行します。
注
SDK の標準ターゲットでは、そのターゲットの依存関係であるターゲットの一覧 (、 など) を含む多数の プロパティを定義します。 たとえば、
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">
プロジェクトをカスタマイズするには、DependsOn プロパティを、ビルド プロセスを拡張する追加のカスタム ターゲットでオーバーライドできます( Visual Studio ビルド プロセスの拡張。
BeforeTargets と AfterTargets
属性と属性を使用して、ターゲットの順序を指定できます。
次のスクリプトについて考えてみましょう。
<Project DefaultTargets="Compile;Link">
<Target Name="Compile">
<Message Text="Compiling" />
</Target>
<Target Name="Link">
<Message Text="Linking" />
</Target>
</Project>
ターゲットの後、 ターゲットの前に実行される中間ターゲット を作成するには、要素内の任意の場所に次のターゲットを追加します。
<Target Name="Optimize" AfterTargets="Compile">
<Message Text="Optimizing" />
</Target>
または、次のように順序を指定します。
<Target Name="Optimize" BeforeTargets="Link">
<Message Text="Optimizing" />
</Target>
同じターゲットでとのを指定することは役に立ちません。 次のセクションで説明するように、最初に検出されたターゲットのみが新しいターゲットを実行します。
ターゲットのビルド順序を決定する
MSBuild は、ターゲット のビルド順序を次のように決定します。
ターゲットが実行されます。
-target スイッチによってコマンド ラインで指定されたターゲットが実行されます。 コマンド ラインにターゲットを指定しないと、 ターゲットが実行されます。 どちらも存在しない場合は、最初に検出されたターゲットが実行されます。
ターゲットの 属性が評価されます。 属性が存在し、と評価された場合、ターゲットは実行されず、スキップされたと見なされます。
条件付きターゲットを または で一覧表示するその他のターゲットは、条件の結果に関係なく、引き続き所定の順序で実行されます。
注
スキップされたターゲットは実行とは見なされません。 別のターゲットが後で を介して要求し、条件が に評価された場合、ターゲットはその時点で実行されます。 ただし、最初にスキップされたターゲットに対して既に実行されているプロセスやアクションは再び実行されません。
ターゲットが実行またはスキップされる前に、属性がターゲットに適用され、に評価されない限り、そのターゲットが実行されます。
注
ターゲットは、出力項目が -date up-toであるために実行されない場合はスキップされたと見なされます ( 増分ビルドを参照)。 このチェックは、ターゲット内のタスクを実行する直前に行われ、ターゲットの実行順序には影響しません。
ターゲットが実行またはスキップされる前に、 属性内のターゲットを一覧表示する他のターゲットが実行されます。
ターゲットを実行する前に、その 属性と 属性が比較されます。 MSBuild で、対応する入力ファイルまたはファイルに関して出力ファイルが古くなっていると判断された場合、MSBuild はターゲットを実行します。 それ以外の場合、MSBuild はターゲットをスキップします。
ターゲットが実行またはスキップされると、 属性でそのターゲットを一覧表示する他のターゲットが実行されます。
関連コンテンツ
- ターゲット