ターゲットのビルド順序
あるターゲットへの入力が別のターゲットの出力に依存する場合、ターゲットの順序を指定する必要があります。 ターゲットの実行順序を指定するには、いくつかの方法があります。
開始ターゲット
既定のターゲット
最初のターゲット
ターゲットの依存関係
BeforeTargets および AfterTargets (MSBuild 4.0)
ビルド内の後続のターゲットがそのターゲットに依存している場合でも、ターゲットが 1 回のビルド中に 2 回実行されることはありません。 ターゲットは一度実行されると、それ以上ビルドに影響しません。
ターゲットには、Condition 属性を指定することができます。 指定した条件が false と評価されると、ターゲットは実行されず、ビルドには影響しません。 条件の詳細については、「MSBuild の条件」を参照してください。
開始ターゲット
Project 要素には、ターゲットをセミコロンで区切った順序付きリストを指定できる省略可能な InitialTargets 属性があります。 次に例を示します。
<Project InitialTargets="Warm;Eject" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
この例では、Warm ターゲットを実行してから Eject ターゲットを実行するように指定しています。
インポートされたプロジェクトには、独自の InitialTargets 属性が含まれている場合があります。 それらのすべての開始ターゲットが集約されて順番に実行されます。 開始ターゲットは、一般的に、エラー チェックに使用されます。
開始ターゲットは、コマンド ラインを使用してオーバーライドできます。 次に例を示します。
msbuild /target:Build;Report
この例では、Build ターゲットを実行してから Report ターゲットを実行するように指定しています。 この方法でターゲットを指定した場合、開始ターゲットは無視されます。
詳細については、「方法 : 最初にビルドするターゲットを指定する」を参照してください。
既定のターゲット
Project 要素には、既定のターゲットをセミコロンで区切った順序付きリストを指定できる省略可能な DefaultTargets 属性もあります。 次に例を示します。
<Project DefaultTargets="Clean;Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
この例では、Clean ターゲットを実行してから Build ターゲットを実行するように指定しています。
インポートされたプロジェクトには、独自の DefaultTargets 属性が含まれている場合があります。 実行される既定のターゲットは、最初にある DefaultTargets 属性によって決まります。
既定のターゲットは、コマンド ラインを使用してオーバーライドできます。 次に例を示します。
msbuild /target:Build;Report
この例では、Build ターゲットを実行してから Report ターゲットを実行するように指定しています。 この方法でターゲットを指定した場合、既定のターゲットは無視されます。
開始ターゲットと既定のターゲットがどちらも指定されており、コマンド ラインでターゲットが指定されていない場合は、先に開始ターゲットが実行されてから既定のターゲットが実行されます。
最初のターゲット
開始ターゲット、既定のターゲット、コマンド ラインのターゲットがいずれも指定されていない場合、プロジェクト ファイル内またはインポートされたプロジェクト ファイル内にある最初のターゲットが実行されます。
ターゲットの依存関係
ターゲットには、他のターゲットとの依存関係を記述できます。 DependsOnTargets 属性は、ターゲットが他のターゲットに依存していることを示します。 次に例を示します。
<Target Name="Serve" DependsOnTargets="Chop;Cook" />
この例では、Serve ターゲットが Chop ターゲットと Cook ターゲットに依存していることを示しています。 この場合、Chop ターゲット、Cook ターゲットの順に実行してから、Serve ターゲットが実行されます。
BeforeTargets および AfterTargets
MSBuild 4.0 では、BeforeTargets 属性と AfterTargets 属性を使用してターゲットの順序を指定できます。
次のようなスクリプトがあるとします。
<Project DefaultTargets="Compile;Link" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Compile">
<Message Text="Compiling" />
</Target>
<Target Name="Link">
<Message Text="Linking" />
</Target>
</Project>
この例の Compile ターゲットと Link ターゲットの間に実行される Optimize というターゲットを作成するには、Project 要素内の任意の位置に次のターゲットを追加します。
<Target Name="Optimize"
AfterTargets="Compile" BeforeTargets="Link">
<Message Text="Optimizing" />
</Target>
ターゲットのビルド順序の決定
MSBuild では、次のようにしてターゲットのビルド順序を決定します。
コマンド ラインで /target スイッチを使用して指定されたターゲットが実行されます。 ターゲットが指定されていない場合、InitialTargets ターゲットが実行され、その後に DefaultTargets ターゲットが実行されます。 それらがいずれも指定されていない場合、最初にあるターゲットが実行されます。
ターゲットの Condition 属性が評価されます。 Condition 属性が指定されていて false と評価された場合、そのターゲットは実行されず、それ以上ビルドには影響しません。
ターゲットの実行前に、そのターゲットの DependsOnTargets ターゲットが実行されます。
ターゲットの実行前に、そのターゲットを BeforeTargets 属性で指定しているターゲットが実行されます。
ターゲットの実行前に、そのターゲットの Inputs 属性と Outputs 属性が比較されます。 対応する入力ファイルに対して出力ファイルが最新ではないと判断された場合、ターゲットは実行されます。 最新である場合は、ターゲットはスキップされます。
ターゲットが実行またはスキップされた後に、そのターゲットを AfterTargets 属性で指定しているターゲットが実行されます。