タスクのバッチの項目メタデータ
MSBuild では、項目メタデータに基づいて項目のリストを異なるカテゴリ (バッチ) に分割し、バッチごとにタスクを 1 回実行できます。 どの項目がどのバッチで渡されるのかを正確に理解することは困難です。 このトピックでは、バッチに関連する次の一般的なシナリオについて説明します。
1 つの項目のリストをバッチに分割
複数の項目のリストをバッチに分割
一度に 1 つの項目をバッチ処理
項目のリストのフィルター処理
MSBuild でのバッチ処理の詳細については、「MSBuild バッチ」を参照してください。
1 つの項目のリストをバッチに分割
バッチにより、項目メタデータに基づいて項目のリストを異なるバッチに分割し、各バッチを個別にタスクに渡すことができます。 これはサテライト アセンブリをビルドする際に便利です。
項目メタデータに基づいて項目のリストをバッチに分割する方法を次の例に示します。 ExampColl 項目のリストが、Number 項目メタデータに基づいて 3 つのバッチに分割されます。 Text 属性内の %(ExampColl.Number) の存在は、バッチを実行する必要があることが MSBuild に通知されます。 ExampColl 項目のリストは、Number メタデータに基づいて 3 つのバッチに分割され、各バッチは個別にタスクに渡されます。
<Project
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ExampColl Include="Item1">
<Number>1</Number>
</ExampColl>
<ExampColl Include="Item2">
<Number>2</Number>
</ExampColl>
<ExampColl Include="Item3">
<Number>3</Number>
</ExampColl>
<ExampColl Include="Item4">
<Number>1</Number>
</ExampColl>
<ExampColl Include="Item5">
<Number>2</Number>
</ExampColl>
<ExampColl Include="Item6">
<Number>3</Number>
</ExampColl>
</ItemGroup>
<Target Name="ShowMessage">
<Message
Text = "Number: %(ExampColl.Number) -- Items in ExampColl: @(ExampColl)"/>
</Target>
</Project>
Message タスクは次の情報を表示します。
Number: 1 -- Items in ExampColl: Item1;Item4
Number: 2 -- Items in ExampColl: Item2;Item5
Number: 3 -- Items in ExampColl: Item3;Item6
複数の項目のリストをバッチに分割
MSBuild では、同じメタデータに基づいて、複数の項目のリストをバッチに分割できます。 こうすると、異なる項目のリストを簡単にバッチに分割して、複数のアセンブリをビルドできます。 たとえば、.cs ファイルの項目のリストをアプリケーション バッチおよびアセンブリ バッチに分割し、リソース ファイルの項目のリストをアプリケーション バッチおよびアセンブリ バッチに分割できます。 次に、バッチを使用して、これらの項目のリストを 1 つのタスクに渡し、アプリケーションとアセンブリの両方をビルドできます。
注意
タスクに渡される項目のリストに、参照されるメタデータと共に項目が含まれていない場合は、その項目のリスト内のすべての項目がすべてのバッチに渡されます。
項目メタデータに基づいて複数の項目のリストをバッチに分割する方法を次の例に示します。 ExampColl および ExampColl2 項目のリストが、Number 項目メタデータに基づいて、それぞれ 3 つのバッチに分割されます。 Text 属性内の %(Number) の存在は、バッチを実行する必要があることを MSBuild に通知します。 ExampColl および ExampColl2 項目のリストは、Number メタデータに基づいて 3 つのバッチに分割され、各バッチは個別にタスクに渡されます。
<Project
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ExampColl Include="Item1">
<Number>1</Number>
</ExampColl>
<ExampColl Include="Item2">
<Number>2</Number>
</ExampColl>
<ExampColl Include="Item3">
<Number>3</Number>
</ExampColl>
<ExampColl2 Include="Item4">
<Number>1</Number>
</ExampColl2>
<ExampColl2 Include="Item5">
<Number>2</Number>
</ExampColl2>
<ExampColl2 Include="Item6">
<Number>3</Number>
</ExampColl2>
</ItemGroup>
<Target Name="ShowMessage">
<Message
Text = "Number: %(Number) -- Items in ExampColl: @(ExampColl) ExampColl2: @(ExampColl2)"/>
</Target>
</Project>
Message タスクは次の情報を表示します。
Number: 1 -- Items in ExampColl: Item1 ExampColl2: Item4
Number: 2 -- Items in ExampColl: Item2 ExampColl2: Item5
Number: 3 -- Items in ExampColl: Item3 ExampColl2: Item6
一度に 1 つの項目をバッチ処理
作成時にすべての項目に割り当てられる既知のアイテム メタデータでもバッチを実行できます。 こうすると、コレクション内のすべての項目がバッチにメタデータを使用します。 Identity メタデータの値は、すべての項目で固有であり、項目のリスト内のすべての項目を個別のバッチに分割する場合に便利です。 既知のアイテム メタデータの完全な一覧については、「MSBuild 既知のアイテム メタデータ」を参照してください。
項目のリスト内の各項目を 1 つずつバッチ処理する方法を次の例に示します。 Identity メタデータの値はすべての項目で固有であるため、ExampColl 項目のリストは 6 個のバッチに分割され、各バッチには項目のリストの 1 つの項目が含まれます。 Text 属性内の %(Identity) の存在は、バッチを実行する必要があることを MSBuild に通知します。
<Project
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ExampColl Include="Item1"/>
<ExampColl Include="Item2"/>
<ExampColl Include="Item3"/>
<ExampColl Include="Item4"/>
<ExampColl Include="Item5"/>
<ExampColl Include="Item6"/>
</ItemGroup>
<Target Name="ShowMessage">
<Message
Text = "Identity: "%(Identity)" -- Items in ExampColl: @(ExampColl)"/>
</Target>
</Project>
Message タスクは次の情報を表示します。
Identity: "Item1" -- Items in ExampColl: Item1
Identity: "Item2" -- Items in ExampColl: Item2
Identity: "Item3" -- Items in ExampColl: Item3
Identity: "Item4" -- Items in ExampColl: Item4
Identity: "Item5" -- Items in ExampColl: Item5
Identity: "Item6" -- Items in ExampColl: Item6
項目のリストのフィルター処理
バッチを使用すると、項目のリストから特定の項目を除外してから、タスクに渡すことができます。 たとえば、Extension の既知のアイテム メタデータの値に対してフィルター処理を行うと、特定の拡張子を持つファイルのみでタスクを実行できます。
項目メタデータに基づいて項目のリストをバッチに分割し、それらのバッチがタスクに渡されるときにフィルター処理を行う方法を次の例に示します。 ExampColl 項目のリストが、Number 項目メタデータに基づいて 3 つのバッチに分割されます。 タスクの Condition 属性は、値が 2 である Number 項目メタデータのバッチのみがタスクに渡されることを指定します。
<Project
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ExampColl Include="Item1">
<Number>1</Number>
</ExampColl>
<ExampColl Include="Item2">
<Number>2</Number>
</ExampColl>
<ExampColl Include="Item3">
<Number>3</Number>
</ExampColl>
<ExampColl Include="Item4">
<Number>1</Number>
</ExampColl>
<ExampColl Include="Item5">
<Number>2</Number>
</ExampColl>
<ExampColl Include="Item6">
<Number>3</Number>
</ExampColl>
</ItemGroup>
<Target Name="Exec">
<Message
Text = "Items in ExampColl: @(ExampColl)"
Condition="'%(Number)'=='2'"/>
</Target>
</Project>
Message タスクは次の情報を表示します。
Items in ExampColl: Item2;Item5