Partager via


Comment : traiter des tâches par lots avec des métadonnées d'élément

Mise à jour : novembre 2007

MSBuild a la capacité de diviser les collections d'éléments en différentes catégories, ou lots, suivant les 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 collection d'éléments en lots

  • Division de plusieurs collections d'éléments en lots

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

  • Filtrage de collections d'éléments

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

Division d'une collection d'éléments en lots

Le traitement par lots vous permet de diviser une collection d'éléments en différents lots en fonction de métadonnées d'éléments, et de passer chacun des lots en une tâche séparément. Cette technique est utile pour générer des assemblys satellites.

L'exemple suivant indique comment diviser une collection d'éléments en lots en fonction de métadonnées d'éléments. La collection d'éléments ExampColl est divisée en trois lots basés sur les métadonnées d'éléments Number. La présence de %(ExampColl.Number)dans Text notifie MSBuild que le traitement par lots doit être exécuté. La collection d'éléments ExampColl est divisée en trois lots basés sur les 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 collections d'éléments en lots

MSBuild peut diviser plusieurs collections d'éléments en lots basés sur les mêmes métadonnées. Cela simplifie la division de différentes collections d'éléments en lots afin de générer plusieurs assemblys. Par exemple, vous pouvez posséder une collection d'éléments de fichiers .cs divisée en un lot d'application et un lot d'assembly, et une collection d'éléments de fichiers de ressources divisée en un lot d'application et un lot d'assembly. Vous pouvez utiliser ensuite le traitement par lots pour passer ces collections d'éléments dans une tâche et générer à la fois l'application et l'assembly.

Remarque :

Si une collection d'éléments qui est 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 collection est passé dans chaque lot.

L'exemple suivant montre comment diviser plusieurs collections d'éléments en lots en fonction de métadonnées d'éléments. Les collections d'éléments ExampColl et ExampColl2 sont divisées chacune en trois lots basés sur les métadonnées d'élément Number. La présence de %(Number) dans l'attribut Text notifie MSBuild que le traitement par lots doit être exécuté. Les collections d'éléments ExampColl et ExampColl2 sont divisées en trois lots basés sur les 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 des métadonnées Identity est unique pour chaque élément et est utile pour diviser chaque élément d'une collection d'éléments en un lot séparé. 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 collection d'éléments un à la fois. Étant donné que la valeur des métadonnées Identity de chaque élément est unique, la collection d'éléments ExampColl est divisée en six lots, chacun contenant un élément de la collection d'éléments. La présence de %(Identity) dans l'attribut Text notifie 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 collections d'éléments

Le traitement par lots peut être utilisé pour exclure par filtrage certains éléments d'une collection 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 collection d'éléments en lots sur la base des métadonnées d'éléments, puis de filtrer ces lots lors de leur passage dans une tâche. La collection d'éléments ExampColl est divisée en trois lots basés sur les métadonnées d'éléments Number. L'attribut Condition de la tâche spécifie que seuls les lots dont la valeur de métadonnées d'é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

Concepts

Traitement par lots de MSBuild

Référence

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

Item, élément (MSBuild)

ItemMetadata, élément (MSBuild)

Autres ressources

Concepts MSBuild

Référence MSBuild