Métadonnées d’élément dans le traitement par lots des tâches
MSBuild peut diviser les listes d’éléments en différentes catégories, ou lots, en fonction des métadonnées des éléments, et exécuter une tâche une fois avec chaque lot. Il peut être difficile de comprendre exactement quels éléments sont passés avec quel lot. Cette rubrique couvre les scénarios courants suivants qui impliquent un traitement par lots.
Division d’une liste d’éléments en lots
Division de plusieurs listes d’éléments en lots
Traitement par lots d’un élément à la fois
Filtrage de listes d’éléments
Pour plus d’informations sur le traitement par lots avec MSBuild, consultez Traitement par lots.
Diviser une liste d’éléments en lots
Le traitement par lots vous permet de diviser une liste d’éléments en différents lots en fonction des métadonnées des éléments et de passer chacun des lots séparément dans une tâche. Ceci est utile pour générer des assemblys satellites.
L’exemple suivant montre comment diviser une liste d’éléments en lots en fonction des métadonnées des éléments. La liste d’éléments ExampColl
est divisée en trois lots en fonction des métadonnées de l’élément Number
. La présence de %(ExampColl.Number)
dans l’attribut Text
indique à MSBuild qu’un traitement par lots doit être effectué. La liste d’éléments ExampColl
est divisée en trois lots en fonction des métadonnées Number
et chaque lot est passé séparément dans la tâche.
<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>
La tâche Message affiche les informations suivantes :
Number: 1 -- Items in ExampColl: Item1;Item4
Number: 2 -- Items in ExampColl: Item2;Item5
Number: 3 -- Items in ExampColl: Item3;Item6
Diviser plusieurs listes d’éléments en lots
MSBuild peut diviser plusieurs listes d’éléments en lots en fonction des métadonnées identiques. Ceci facilite la division de différentes listes d’éléments en lots pour générer plusieurs assemblys. Par exemple, vous pouvez avoir une liste d’éléments de fichiers .cs divisée en un lot d’application et un lot d’assembly, et une liste d’éléments de fichiers de ressources divisée en un lot d’application et un lot d’assembly. Vous pouvez ensuite utiliser le traitement par lots pour passer ces listes d’éléments dans une même tâche et générer l’application et l’assembly.
Notes
Si une liste d’éléments passée dans une tâche ne contient aucun élément avec les métadonnées référencées, chaque élément de cette liste est passé dans chaque lot.
L’exemple suivant montre comment diviser une liste de plusieurs éléments en lots en fonction des métadonnées des éléments. Les listes d’éléments ExampColl
et ExampColl2
sont divisées en trois lots en fonction des métadonnées de l’élément Number
. La présence de %(Number)
dans l’attribut Text
indique à MSBuild qu’un traitement par lots doit être effectué. Les listes d’éléments ExampColl
et ExampColl2
sont divisées en trois lots en fonction des métadonnées Number
et chaque lot est passé séparément dans la tâche.
<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>
La tâche Message affiche les informations suivantes :
Number: 1 -- Items in ExampColl: Item1 ExampColl2: Item4
Number: 2 -- Items in ExampColl: Item2 ExampColl2: Item5
Number: 3 -- Items in ExampColl: Item3 ExampColl2: Item6
Traiter par lots un élément à la fois
Le traitement par lots peut également être effectué sur les métadonnées d’éléments connus qui sont affectés à chaque élément à la création. Cela garantit que chaque élément d’une collection a des métadonnées à utiliser pour le traitement par lots. La valeur des métadonnées Identity
est utile pour diviser chaque élément d’une liste d’éléments en un lot distinct. Pour obtenir la liste complète des métadonnées d’élément connues, consultez Métadonnées d’élément connues.
L’exemple suivant montre comment traiter par lots chaque élément d’une liste d’éléments un à la fois. La liste d’éléments ExampColl
est divisée en six lots, chacun contenant un élément de la liste d’éléments. La présence de %(Identity)
dans l’attribut Text
indique à MSBuild qu’un traitement par lots doit être effectué.
<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>
La tâche Message affiche les informations suivantes :
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
Toutefois, il n’est pas garanti que Identity
soit unique ; sa valeur est la valeur finale évaluée de l’attribut Include
. Par conséquent, si des attributs Include
sont utilisés plusieurs fois, ils sont regroupés. Comme le montre l’exemple suivant, cette technique nécessite que les attributs Include
soient uniques pour chaque élément du groupe. Pour illustrer cela, considérez le code suivant :
<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>
La sortie indique que les deux premiers éléments se trouvent dans le même lot, car l’attribut Include
est le même pour eux :
test.proj(15,5): warning : 1: 1;1: 2
test.proj(15,5): warning : 2: 3
Filtrer des listes d’éléments
Le traitement par lots peut être utilisé pour filtrer certains éléments d’une liste d’éléments avant de la passer à une tâche. Par exemple, le filtrage sur les valeurs de métadonnées d’éléments connues Extension
vous permet d’exécuter une tâche seulement sur des fichiers avec une extension spécifique.
L’exemple suivant montre comment diviser une liste d’éléments en lots en fonction des métadonnées des éléments, puis filtrer ces lots quand ils sont passés dans une tâche. La liste d’éléments ExampColl
est divisée en trois lots en fonction des métadonnées de l’élément Number
. L’attribut Condition
de la tâche spécifie que seuls les lots avec une valeur de métadonnées d’élément Number
égale à 2
doivent être passés dans la tâche.
<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>
La tâche Message affiche les informations suivantes :
Items in ExampColl: Item2;Item5