方法 : アイテム メタデータを使用してタスクを一度に処理する
更新 : 2007 年 11 月
MSBuild では、アイテム メタデータに基づいて項目のコレクションを異なるカテゴリ (バッチ) に分割し、バッチごとにタスクを 1 度実行できます。どの項目がどのバッチで渡されるのかを正確に理解することは困難です。このトピックでは、バッチに関連する次の一般的なシナリオについて説明します。
1 つの項目のコレクションをバッチに分割
複数の項目のコレクションをバッチに分割
一度に 1 つの項目をバッチ処理
項目のコレクションのフィルタ処理
MSBuild でのバッチ処理の詳細については、「MSBuild バッチ」を参照してください。
項目のコレクションをバッチに分割
バッチにより、アイテム メタデータに基づいて項目のコレクションを異なるバッチに分割し、各バッチを個別にタスクに渡すことができます。これはサテライト アセンブリをビルドする際に便利です。
アイテム メタデータに基づいて項目のコレクションをバッチに分割する方法を次の例に示します。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 既知のアイテム メタデータ」を参照してください。
項目のコレクション内の各項目を一度にバッチする方法を次の例に示します。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