Cómo: Procesar tareas por lotes utilizando metadatos de elementos

Actualización: noviembre 2007

MSBuild tiene la capacidad de dividir las colecciones de elementos en distintas categorías, o lotes, basándose en los metadatos de estos elementos, y luego ejecutar una tarea una vez con cada lote. Puede resultar complicado entender exactamente qué elementos se pasan con cada lote. En este tema se tratan los escenarios comunes siguientes en los que se utiliza el procesamiento por lotes.

  • Dividir una colección de elementos en lotes

  • Dividir varias colecciones de elementos en lotes

  • Procesar por lotes un elemento cada vez

  • Filtrar las colecciones de elementos

Para obtener más información sobre el procesamiento por lotes con MSBuild, vea Procesamiento por lotes de MSBuild.

Dividir una colección de elementos en lotes

El procesamiento por lotes permite dividir una colección de elementos en distintos lotes basándose en los metadatos de esos elementos, y luego pasar cada uno de los lotes a una tarea por separado. Esto resulta útil para generar ensamblados satélite.

El ejemplo siguiente muestra cómo dividir una colección de elementos en lotes basándose en los metadatos de los elementos. La colección de elementos ExampColl se divide en tres lotes según los metadatos del elemento Number. La presencia de %(ExampColl.Number) en el atributo Text indica a MSBuild que se debe realizar el procesamiento por lotes. La colección de elementos ExampColl se divide en tres lotes según los metadatos de Number y cada lote se pasa a la tarea por separado.

<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 tarea Message (Tarea) muestra la información siguiente:

Number: 1 -- Items in ExampColl: Item1;Item4

Number: 2 -- Items in ExampColl: Item2;Item5

Number: 3 -- Items in ExampColl: Item3;Item6

Dividir varias colecciones de elementos en lotes

MSBuild puede dividir varias colecciones de elementos en lotes basándose en los mismos metadatos. Esto facilita la división de diferentes colecciones de elementos en lotes para generar varios ensamblados. Por ejemplo, se puede dividir una colección de elementos de archivos .cs en un lote de aplicación y un lote de ensamblado, y dividir una colección de elementos de archivos de recursos en un lote de aplicación y un lote de ensamblado. A continuación, se puede utilizar el procesamiento por lotes para pasar estas colecciones de elementos a una misma tarea y generar la aplicación y el ensamblado.

Nota:

Si una colección de elementos pasada a una tarea no contiene ningún elemento con los metadatos a los que se hace referencia, todos los elementos de esa colección se pasan a todos los lotes.

El ejemplo siguiente muestra cómo dividir varias colecciones de elementos en lotes basándose en los metadatos de los elementos. Las colecciones de elementos ExampColl y ExampColl2 se han dividido en tres lotes cada una, basándose en los metadatos del elemento Number. La presencia de %(Number) en el atributo Text indica a MSBuild que se debe realizar el procesamiento por lotes. Las colecciones de elementos ExampColl y ExampColl2 se dividen en tres lotes según los metadatos de Number y cada lote se pasa a la tarea por separado.

<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 tarea Message (Tarea) muestra la información siguiente:

Number: 1 -- Items in ExampColl: Item1 ExampColl2: Item4

Number: 2 -- Items in ExampColl: Item2 ExampColl2: Item5

Number: 3 -- Items in ExampColl: Item3 ExampColl2: Item6

Procesar por lotes un elemento cada vez

El procesamiento por lotes también se puede realizar en metadatos de elementos conocidos que se asignan a cada elemento durante su creación. De este modo se garantiza que cada elemento de una colección disponga de metadatos que utilizar para el procesamiento por lotes. El valor de metadatos Identity es único para cada elemento y resulta de gran utilidad para dividir cada elemento de una colección de elementos en un lote independiente. Para obtener una lista completa de metadatos de elementos conocidos, vea Metadatos de los elementos conocidos de MSBuild.

El ejemplo siguiente muestra cómo procesar por lotes cada uno de los elementos de una colección, de uno en uno. Dado que el valor de metadatos Identity de cada elemento es único, la colección de elementos ExampColl se divide en seis lotes, cada uno de los cuales contiene un elemento de la colección. La presencia de %(Identity) en el atributo Text indica a MSBuild que se debe realizar el procesamiento por lotes.

<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 tarea Message (Tarea) muestra la información siguiente:

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

Filtrar las colecciones de elementos

El procesamiento por lotes se puede utilizar para filtrar y extraer determinados elementos de una colección de elementos antes de pasarla a una tarea. Por ejemplo, si se aplica como filtro el valor de metadatos de elementos conocidos Extension, se puede ejecutar una tarea únicamente en los archivos que tienen una extensión concreta.

El ejemplo siguiente muestra cómo dividir una colección de elementos en lotes basándose en los metadatos de los elementos y, a continuación, filtrar los lotes al pasarlos a una tarea. La colección de elementos ExampColl se divide en tres lotes según los metadatos del elemento Number. El atributo Condition de la tarea especifica que sólo los lotes cuyo valor de metadatos del elemento Number sea 2 se pasarán a la tarea.

<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 tarea Message (Tarea) muestra la información siguiente:

Items in ExampColl: Item2;Item5

Vea también

Conceptos

Procesamiento por lotes de MSBuild

Referencia

Metadatos de los elementos conocidos de MSBuild

Elemento Item (MSBuild)

Elemento ItemMetadata (MSBuild)

Otros recursos

Conceptos de MSBuild

Referencia de MSBuild