Elementmetadaten bei der Batchverarbeitung von Aufgaben
MSBuild kann Elementlisten anhand von Elementmetadatenelementen in verschiedene Kategorien oder Batches unterteilen und einmal mit jedem Batch eine Aufgabe ausführen. Es ist schwierig zu erkennen, welche Elemente mit welchem Batch übergeben werden. In diesem Artikel werden die folgenden häufig auftretenden Szenarios thematisiert, bei denen die Batchverarbeitung ein Bestandteil ist.
Unterteilen einer Elementliste in Batches
Unterteilen mehrerer Elementlisten in Batches
Batchverarbeitung einzelner Elemente
Filtern von Elementlisten
Weitere Informationen zur Batchverarbeitung mit MSBuild finden Sie unter Batchverarbeitung.
Unterteilen einer Elementliste in Batches
Mithilfe der Batchverarbeitung können Sie anhand von Elementmetadatenelementen eine Elementliste in verschiedene Batches unterteilen und diese Batches anschließend einzeln an eine Aufgabe übergeben. Dieser Vorgang ist nützlich für die Erstellung von Satellitenassemblys.
Im untenstehenden Beispiel wird dargestellt, wie Sie eine Elementliste anhand von Elementmetadatenelementen in Batches unterteilen können. Die Elementliste ExampColl
wird anhand des Elementmetadatenelements Number
in drei Batches unterteilt. Durch das Vorhandensein von %(ExampColl.Number)
im Text
-Attribut wird MSBuild benachrichtigt, dass eine Batchverarbeitung ausgeführt werden sollte. Die Elementliste ExampColl
ist anhand des Elementmetadatenelements Number
in drei Batches unterteilt, und jeder Batch wird einzeln an eine Aufgabe übergeben.
<Project
xmlns="http://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>
Die Message Task zeigt die folgenden Informationen an:
Number: 1 -- Items in ExampColl: Item1;Item4
Number: 2 -- Items in ExampColl: Item2;Item5
Number: 3 -- Items in ExampColl: Item3;Item6
Unterteilen mehrerer Elementlisten in Batches
MSBuild kann mehrere Elementlisten anhand derselben Metadaten in Batches unterteilen. Dadurch können verschiedene Elementlisten einfacher in Batches unterteilt werden, um mehrere Assemblys zu erstellen. Beispielsweise kann eine Elementliste mit CS-Dateien, die in ein Anwendungs- und ein Assemblybatch unterteilt sind, sowie eine Elementliste mit Ressourcendateien, die in ein Anwendungs- und ein Assemblybatch unterteilt sind, vorhanden sein. In diesem Fall können Sie die Batchverarbeitung nutzen, um diese Elementlisten an eine Aufgabe zu übergeben und sowohl die Anwendung als auch die Assembly zu erstellen.
Hinweis
Wenn eine Elementliste, die an eine Aufgabe übergeben wird, keine Elemente mit dem Metadatenelement enthält, auf das verwiesen wird, werden sämtliche Elemente in dieser Elementliste an jeden Batch übergeben.
Im untenstehenden Beispiel wird dargestellt, wie Sie mehrere Elementlisten anhand von Elementmetadatenelementen in Batches unterteilen können. Die Elementlisten ExampColl
und ExampColl2
werden jeweils anhand des Elementmetadatenelements Number
in drei Batches unterteilt. Durch das Vorhandensein von %(Number)
im Text
-Attribut wird MSBuild benachrichtigt, dass eine Batchverarbeitung ausgeführt werden sollte. Die Elementlisten ExampColl
und ExampColl2
werden jeweils anhand des Elementmetadatenelements Number
in drei Batches unterteilt, und jeder Batch wird einzeln an eine Aufgabe übergeben.
<Project
xmlns="http://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>
Die Message Task zeigt die folgenden Informationen an:
Number: 1 -- Items in ExampColl: Item1 ExampColl2: Item4
Number: 2 -- Items in ExampColl: Item2 ExampColl2: Item5
Number: 3 -- Items in ExampColl: Item3 ExampColl2: Item6
Batchverarbeitung einzelner Elemente nacheinander
Die Batchverarbeitung kann auch für bekannte Elementmetadaten durchgeführt werden, die jedem Element bei der Erstellung zugeordnet werden. Dadurch wird garantiert, dass jedes Element in einer Auflistung auch über Metadaten verfügt, die bei der Batchverarbeitung verwendet werden können. Der Identity
-Metadatenwert ist nützlich für die Unterteilung der in Elementlisten enthaltenen Elemente in separate Batches. Eine vollständige Liste bekannter Elementmetadaten finden Sie unter Bekannte Elementmetadaten.
Im untenstehenden Beispiel wird dargestellt, wie Sie die Elemente in einer Elementliste einzeln nacheinander in Batches unterteilen können. Die ExampColl
-Elementliste ist in sechs Batches unterteilt, wobei jeder Batch ein Element der Elementliste enthält. Durch das Vorhandensein von %(Identity)
im Text
-Attribut wird MSBuild benachrichtigt, dass eine Batchverarbeitung ausgeführt werden sollte.
<Project
xmlns="http://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>
Die Message Task zeigt die folgenden Informationen an:
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
Es ist jedoch nicht garantiert, dass Identity
eindeutig ist. Der Wert ist der ausgewertete endgültige Wert des Include
-Attributs. Wenn Include
-Attribute mehrmals verwendet werden, werden sie daher in Batches zusammengefasst. Wie das folgende Beispiel zeigt, müssen bei dieser Vorgehensweise die Include
-Attribute für jedes Element in der Gruppe eindeutig sein. Betrachten Sie den folgenden Code, um diesen Aspekt zu veranschaulichen:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Item Include="1">
<M>1</M>
</Item>
<Item Include="1">
<M>2</M>
</Item>
<Item Include="2">
<M>3</M>
</Item>
</ItemGroup>
<Target Name="Batching">
<Warning Text="@(Item->'%(Identity): %(M)')" Condition=" '%(Identity)' != '' "/>
</Target>
</Project>
Die Ausgabe zeigt, dass sich die ersten beiden Elemente im selben Batch befinden, da das Include
-Attribut für sie identisch ist:
test.proj(15,5): warning : 1: 1;1: 2
test.proj(15,5): warning : 2: 3
Filtern von Elementlisten
Die Batchverarbeitung kann auch dafür genutzt werden, bestimmte Elemente einer Elementliste herauszufiltern, bevor sie an eine Aufgabe übergeben wird. Wenn Sie z.B. nach dem bekannten Extension
-Elementmetadatenwert filtern, können Sie eine Aufgabe nur für Dateien ausführen, die eine spezifische Erweiterung enthalten.
Im untenstehenden Beispiel wird dargestellt, wie Sie zunächst eine Elementliste anhand eines Elementmetadatenelements in Batches unterteilen und anschließend diese Batches bei der Übergabe an eine Aufgabe filtern. Die Elementliste ExampColl
wird anhand des Elementmetadatenelements Number
in drei Batches unterteilt. Das Condition
-Attribut einer Aufgabe gibt an, dass nur Batches mit einem Number
-Elementmetadatenwert von 2
an die Aufgabe übergeben werden sollen.
<Project
xmlns="http://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>
Die Message Task zeigt die folgenden Informationen an:
Items in ExampColl: Item2;Item5