Métadonnées d'éléments dans le traitement par lots de tâches

MSBuild a la capacité de diviser les listes d'éléments en différentes catégories, ou lots, en fonction des métadonnées d'éléments, et d'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 du 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 des listes d'éléments

Pour plus d'informations sur le traitement par lots avec MSBuild, consultez Traitement par lots de MSBuild.

Division d'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 de métadonnées d'éléments, et de passer chacun de ces lots dans une tâche distincte. Cette technique est utile pour générer des assemblys satellites.

L'exemple suivant indique comment diviser une liste d'éléments en lots en fonction de métadonnées d'é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 signale à MSBuild qu'un traitement par lots doit être exécuté. 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="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>

La tâche Tâche de 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

Division de plusieurs listes d'éléments en lots

MSBuild peut diviser plusieurs listes d'éléments en lots selon les mêmes métadonnées. Cela simplifie la division de différentes listes d'éléments en lots afin de générer plusieurs assemblys. Par exemple, vous pouvez posséder 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 tâche et générer à la fois l'application et l'assembly.

Notes

Si une liste d'éléments passée dans une tâche ne contient pas d'éléments avec les métadonnées référencées, chaque élément de cette liste est passé dans chaque lot.

L'exemple suivant indique comment diviser plusieurs listes d'éléments en lots en fonction de métadonnées d'éléments. Les listes d'éléments ExampColl et ExampColl2 sont divisées chacune en trois lots basés en fonction des métadonnées de l'élément Number. La présence de %(Number) dans l'attribut Text signale à MSBuild que le traitement par lots doit être exécuté. 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="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>

La tâche Tâche de 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

Traitement par lots d'un élément à la fois

Le traitement par lots peut également être effectué sur les métadonnées d'éléments connus qui sont assignées à chaque élément lors de sa création. Cela garantit que chaque élément d'une collection ait des métadonnées à utiliser pour le traitement par lots. La valeur de métadonnée Identity est unique pour chaque élément et est utile pour diviser chaque élément d'une liste d'éléments en un lot distinct. Pour la liste complète des métadonnées d'éléments connus, consultez Métadonnées d'éléments connus MSBuild.

L'exemple suivant montre comment traiter par lots chaque élément d'une liste d'éléments, un par un. Étant donné que la valeur des métadonnées Identity de chaque élément est unique, 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 signale à MSBuild que le traitement par lots doit être exécuté.

<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: &quot;%(Identity)&quot; -- Items in ExampColl: @(ExampColl)"/>
    </Target>

</Project>

La tâche Tâche de 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

Filtrage des listes d'éléments

Le traitement par lots peut être utilisé pour exclure par filtrage certains éléments d'une liste d'éléments avant de la passer à une tâche. Par exemple, filtrer sur la valeur des métadonnées d'éléments connus Extension vous permet d'exécuter une tâche sur les seuls fichiers dotés d'une extension spécifique.

L'exemple suivant indique comment diviser une liste d'éléments en lots en fonction des métadonnées d'éléments, puis comment filtrer ces lots lors de leur passage 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 dont la valeur de métadonnées de l'élément Number est égale à 2 sont passés dans la tâche.

<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>

La tâche Tâche de message affiche les informations suivantes :

Items in ExampColl: Item2;Item5

Voir aussi

Référence

Métadonnées d'éléments connus MSBuild

Item, élément (MSBuild)

ItemMetadata, élément (MSBuild)

Concepts

Traitement par lots de MSBuild

Autres ressources

Concepts MSBuild

Référence MSBuild