MSBuild バッチ
MSBuild では、項目メタデータに基づいて項目のリストをさまざまなカテゴリ (バッチ) に分割し、バッチごとにターゲットまたはタスクを 1 回実行できます。
タスクのバッチ
タスクのバッチを使用すると、項目のリストをさまざまなバッチに分割して、各バッチを個別にタスクに渡すことによって、プロジェクト ファイルを簡略化できます。これは、プロジェクト ファイルでタスクとその属性を、複数回実行できるものであっても一度だけ宣言する必要があることを意味します。
%(ItemMetaDataName) 表記をいずれかのタスク属性で使用して、MSBuild でタスクのバッチを実行することを指定します。次の例は、Color 項目メタデータ値に基づいて Example 項目のリストをバッチに分割し、各バッチを個別に MyTask タスクに渡します。
[!メモ]
タスク属性で項目のリストを参照しない場合や、メタデータ名があいまいな場合は、%(ItemCollection.ItemMetaDataName) 表記を使用すると、バッチに使用する項目メタデータ値を完全に修飾できます。
<Project
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Example Include="Item1">
<Color>Blue</Color>
</Example>
<Example Include="Item2">
<Color>Red</Color>
</Example>
</ItemGroup>
<Target Name="RunMyTask">
<MyTask
Sources = "@(Example)"
Output = "%(Color)\MyFile.txt"/>
</Target>
</Project>
より詳細なバッチの例については、「タスクのバッチの項目メタデータ」を参照してください。
ターゲットのバッチ
MSBuild は、ターゲットの入力および出力が最新かどうかを確認してから、ターゲットを実行します。入力と出力の両方が最新である場合、ターゲットはスキップされます。ターゲット内のタスクがバッチを使用する場合、MSBuild は項目の各バッチの入力および出力が最新かどうかを確認する必要があります。最新でない場合、ターゲットはヒットするたびに実行されます。
次の例に %(ItemMetaDataName) 表記の Outputs 属性を含む Target 要素を示します。MSBuild は、Color 項目メタデータに基づいて Example 項目のリストをバッチに分割し、各バッチの出力ファイルのタイムスタンプを分析します。バッチからの出力が最新でない場合は、ターゲットが実行されます。最新である場合は、ターゲットはスキップされます。
<Project
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Example Include="Item1">
<Color>Blue</Color>
</Example>
<Example Include="Item2">
<Color>Red</Color>
</Example>
</ItemGroup>
<Target Name="RunMyTask"
Inputs="@(Example)"
Outputs="%(Color)\MyFile.txt">
<MyTask
Sources = "@(Example)"
Output = "%(Color)\MyFile.txt"/>
</Target>
</Project>
ターゲットのバッチの別の例については、「ターゲットのバッチの項目メタデータ」を参照してください。
メタデータを使用するプロパティ関数
バッチは、メタデータを含むプロパティ関数によって制御できます。次に例を示します。
$([System.IO.Path]::Combine($(RootPath),%(Compile.Identity)))
このコードは、Combine を使用して、ルート フォルダー パスを Compile の項目パスと結合します。
プロパティ関数は、メタデータ値の内部には記述できません。次に例を示します。
%(Compile.FullPath.Substring(0,3))
このようなコードは許可されません。
プロパティ関数の詳細については、「プロパティ関数」を参照してください。