Metadati degli elementi nella suddivisione in batch delle attività

MSBuild ha la possibilità di dividere gli elenchi di elementi in categorie diverse, o batch, in base ai metadati degli elementi ed eseguire un'attività una volta con ogni batch. Può non essere semplice comprendere esattamente quali elementi vengono passati e a quale batch. Questo argomento descrive gli scenari più comuni relativi alla suddivisione in batch.

  • Suddivisione in batch di un elenco di elementi

  • Suddivisione in batch di più elenchi di elementi

  • Suddivisione in batch di un elemento per volta

  • Filtraggio di elenchi di elementi

Per altre informazioni sull'invio in batch con MSBuild, vedere Invio in batch.

Suddividere in batch un elenco di elementi

La suddivisione in batch consente di dividere un elenco di elementi in vari batch in base ai metadati degli elementi e di passare separatamente ogni batch a un'attività. Questa procedura è utile per compilare assembly satellite.

L'esempio seguente illustra come dividere in batch un elenco di elementi in base ai metadati degli elementi. L'elenco di elementi ExampColl viene diviso in tre batch in base ai metadati dell'elemento Number. La presenza di %(ExampColl.Number)nell'attributo notifica a MSBuild che deve essere eseguita l'invio Text in batch. L'elenco di elementi ExampColl viene diviso in tre batch in base ai metadati dell'elemento Number e ogni batch viene passato separatamente all'attività.

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

L'attività Message visualizza le informazioni seguenti:

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

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

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

Suddividere in batch più elenchi di elementi

MSBuild può dividere più elenchi di elementi in batch in base agli stessi metadati. Risulta quindi più semplice dividere in batch diversi elenchi di elementi per compilare più assembly. Si supponga di avere un elenco di elementi di file con estensione cs divisi in un batch di applicazione e in un batch di assembly e un elenco di elementi di file di risorse divisi nella stessa maniera. Sarà quindi possibile usare la suddivisione in batch per passare questi elenchi di elementi a un'attività e compilare sia l'applicazione che l'assembly.

Nota

Se un elenco di elementi passato a un'attività non contiene elementi con i metadati di riferimento, ogni elemento incluso nell'elenco viene passato a ogni batch.

Nell'esempio seguente viene illustrato come dividere più elenchi di elementi in batch in base ai metadati degli elementi. Gli elenchi di elementi ExampColl e ExampColl2 vengono divisi ognuno in tre batch in base ai metadati dell'elemento Number. La presenza di %(Number)nell'attributo notifica a MSBuild che deve essere eseguita l'invio Text in batch. Gli elenchi di elementi ExampColl e ExampColl2 vengono divisi in tre batch in base ai metadati dell'elemento Number e ogni batch viene passato separatamente all'attività.

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

L'attività Message visualizza le informazioni seguenti:

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

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

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

Suddividere in batch di un elemento per volta

È possibile eseguire la suddivisione in batch anche su metadati noti assegnati a ogni elemento al momento della creazione. In questo modo ogni elemento di una raccolta avrà alcuni metadati da usare per la suddivisione in batch. Il Identity valore dei metadati è utile per dividere ogni elemento di un elenco di elementi in un batch separato. Per un elenco completo di tutti i metadati noti degli elementi, vedere Metadati noti degli elementi.

L'esempio seguente illustra come eseguire in batch un elemento di un elenco per volta. L'elenco ExampColl di elementi è suddiviso in sei batch, ogni batch contenente un elemento dell'elenco di elementi. La presenza di %(Identity)nell'attributo notifica a MSBuild che deve essere eseguita l'invio Text in batch.

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

L'attività Message visualizza le informazioni seguenti:

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

Tuttavia, Identity non è garantito che sia univoco. Il relativo valore è il valore finale valutato dell'attributo Include . Pertanto, se vengono Include usati più volte, gli attributi vengono raggruppati in batch. Come illustrato nell'esempio seguente, questa tecnica richiede che gli Include attributi siano univoci per ogni elemento del gruppo. Per illustrare questo punto, considerare il codice seguente:

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

L'output mostra che i primi due elementi si trovano nello stesso batch, perché l'attributo Include è lo stesso per loro:

test.proj(15,5): warning : 1: 1;1: 2
test.proj(15,5): warning : 2: 3

Filtrare gli elementi di un elenco

È possibile usare la suddivisione in batch per filtrare alcuni elementi da un elenco prima di passarli a un'attività. Ad esempio, l'applicazione di un filtro al valore Extension dei metadati di un elemento noto consente di eseguire un'attività solo sui file con una determinata estensione.

L'esempio seguente illustra come dividere in batch un elenco di elementi in base ai metadati degli elementi e come filtrare i batch risultanti nel momento in cui vengono passati a un'attività. L'elenco di elementi ExampColl viene diviso in tre batch in base ai metadati dell'elemento Number. L'attributo Condition dell'attività specifica che verranno passati all'attività esclusivamente i batch con un valore di metadati dell'elemento Number pari a 2.

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

L'attività Message visualizza le informazioni seguenti:

Items in ExampColl: Item2;Item5