次の方法で共有


ターゲットのビルド順序

あるターゲットへの入力が別のターゲットの出力に依存する場合は、ターゲットを並べ替える必要があります。 これらの属性を使用して、ターゲットを実行する順序を指定できます。

  • InitialTargets。 この Project 属性は、コマンド ラインまたは DefaultTargets 属性でターゲットが指定されている場合でも、最初に実行されるターゲットを指定します。

  • DefaultTargets。 この Project 属性は、コマンド ラインでターゲットが明示的に指定されていない場合に実行されるターゲットを指定します。

  • DependsOnTargets。 この Target 属性は、このターゲットを実行する前に実行する必要があるターゲットを指定します。

  • BeforeTargetsAfterTargets. これらの Target 属性は、指定したターゲットの前または後に、このターゲットを実行することを指定します。

一般に、宣言の順序に依存して、他のタスクの前に実行されるタスクを指定しないでください。

ビルド内の後続のターゲットが依存している場合でも、ビルド中にターゲットが 2 回実行されることはありません。 ターゲットが実行されると、ビルドへのその貢献が完了します。

ターゲットは、 Condition 属性を持つことができます。 指定した条件が falseに評価された場合、ターゲットは実行されず、ビルドには影響しません。 条件の詳細については、「 条件」を参照してください。

初期ターゲット

InitialTargets 要素の属性は、ターゲットがコマンド ラインまたは DefaultTargets 属性で指定されている場合でも、最初に実行されるターゲットを指定します。 最初のターゲットは、通常、エラー チェックに使用されます。

InitialTargets属性の値には、ターゲットのセミコロン区切りの順序付きリストを指定できます。 次の例では、 Warm ターゲットが実行され、 Eject ターゲットが実行されることを指定します。

<Project InitialTargets="Warm;Eject">

インポートされたプロジェクトは、独自の InitialTargets 属性を持つことができます。 すべての初期ターゲットはまとめて集計され、順番に実行されます。

詳細については、「 方法: 最初にビルドするターゲットを指定する」を参照してください。

既定のターゲット

DefaultTargets 要素の属性は、コマンド ラインでターゲットが明示的に指定されていない場合にビルドされるターゲットを指定します。

DefaultTargets属性の値は、既定のターゲットのセミコロン区切りの順序付きリストにすることができます。 次の例では、 Clean ターゲットが実行され、 Build ターゲットが実行されることを指定します。

<Project DefaultTargets="Clean;Build">

コマンド ラインの -target スイッチを使用して、既定のターゲットをオーバーライドできます。 次の例では、 Build ターゲットが実行され、 Report ターゲットが実行されることを指定します。 この方法でターゲットを指定すると、既定のターゲットはすべて無視されます。

msbuild -target:Build;Report

初期ターゲットと既定のターゲットの両方が指定され、コマンド ライン ターゲットが指定されていない場合、MSBuild は最初に初期ターゲットを実行してから、既定のターゲットを実行します。

インポートされたプロジェクトは、独自の DefaultTargets 属性を持つことができます。 最初に検出された DefaultTargets 属性によって、実行される既定のターゲットが決まります。

詳細については、「 方法: 最初にビルドするターゲットを指定する」を参照してください。

最初のターゲット

初期ターゲット、既定のターゲット、またはコマンド ライン ターゲットがない場合、MSBuild は、プロジェクト ファイルまたはインポートされたプロジェクト ファイルで最初に検出されたターゲットを実行します。

ターゲットの依存関係

ターゲットは、相互の依存関係を記述できます。 DependsOnTargets属性は、ターゲットが他のターゲットに依存していることを示します。 たとえば、

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

は、 Serve ターゲットが Chop ターゲットと Cook ターゲットに依存することを MSBuild に通知します。 MSBuild は、Chop ターゲットを実行し、Cook ターゲットを実行する前にServe ターゲットを実行します。

SDK の標準ターゲットでは、そのターゲットの依存関係であるターゲットの一覧 (DependsOn$(BuildDependsOn) など) を含む多数の$(CleanDependsOn) プロパティを定義します。 たとえば、

<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">

プロジェクトをカスタマイズするには、「DependsOnの拡張」の説明に従って、ビルド プロセスを拡張する追加のカスタム ターゲットでプロパティをオーバーライドできます。

BeforeTargets と AfterTargets

BeforeTargets属性とAfterTargets属性を使用して、ターゲットの順序を指定できます。

次のスクリプトについて考えてみましょう。

<Project DefaultTargets="Compile;Link">
    <Target Name="Compile">
        <Message Text="Compiling" />
    </Target>
    <Target Name="Link">
        <Message Text="Linking" />
    </Target>
</Project>

Optimize ターゲットの後、Compile ターゲットの前に実行される中間ターゲット Linkを作成するには、Project要素内の任意の場所に次のターゲットを追加します。

<Target Name="Optimize" AfterTargets="Compile">
    <Message Text="Optimizing" />
</Target>

または、次のように順序を指定します。

<Target Name="Optimize" BeforeTargets="Link">
    <Message Text="Optimizing" />
</Target>

同じターゲットでBeforeTargetsAfterTargetsを指定することは役に立ちません。 次のセクションで説明するように、最初に検出されたターゲットのみが新しいターゲットを実行します。

ターゲットのビルド順序を決定する

MSBuild は、ターゲット のビルド順序を次のように決定します。

  1. InitialTargets ターゲットが実行されます。

  2. -target スイッチによってコマンド ラインで指定されたターゲットが実行されます。 コマンド ラインにターゲットを指定しないと、 DefaultTargets ターゲットが実行されます。 どちらも存在しない場合は、最初に検出されたターゲットが実行されます。

  3. ターゲットの Condition 属性が評価されます。 Condition属性が存在し、falseに評価された場合、ターゲットは実行されず、ビルドにそれ以上影響しません。

    条件付きターゲットを BeforeTargets または AfterTargets で一覧表示するその他のターゲットは、条件の結果に関係なく、引き続き所定の順序で実行されます。

  4. ターゲットが実行またはスキップされる前に、DependsOnTargets属性がターゲットに適用され、Conditionに評価されない限り、そのfalseターゲットが実行されます。

    ターゲットは、出力項目が -date up-toであるために実行されない場合はスキップされたと見なされます ( 増分ビルドを参照)。 このチェックは、ターゲット内のタスクを実行する直前に行われ、ターゲットの実行順序には影響しません。

  5. ターゲットが実行またはスキップされる前に、 BeforeTargets 属性内のターゲットを一覧表示する他のターゲットが実行されます。

  6. ターゲットを実行する前に、その Inputs 属性と Outputs 属性が比較されます。 MSBuild で、対応する入力ファイルまたはファイルに関して出力ファイルが古くなっていると判断された場合、MSBuild はターゲットを実行します。 それ以外の場合、MSBuild はターゲットをスキップします。

  7. ターゲットが実行またはスキップされると、 AfterTargets 属性でそのターゲットを一覧表示する他のターゲットが実行されます。