Metadane elementu w przetwarzaniu wsadowym zadań

Program MSBuild może podzielić listy elementów na różne kategorie lub partie na podstawie metadanych elementu i uruchomić zadanie jednorazowo z każdą partią. Może to być mylące, aby zrozumieć dokładnie, jakie elementy są przekazywane do której partii. W tym temacie opisano następujące typowe scenariusze obejmujące dzielenie na partie.

  • Dzielenie listy elementów na partie

  • Dzielenie kilku list elementów na partie

  • Dzielenie na partie jednego elementu naraz

  • Filtrowanie list elementów

Aby uzyskać więcej informacji na temat dzielenia na partie przy użyciu programu MSBuild, zobacz Batching (Przetwarzanie wsadowe).

Dzielenie listy elementów na partie

Przetwarzanie wsadowe umożliwia podzielenie listy elementów na różne partie na podstawie metadanych elementu i przekazanie każdej partii do zadania oddzielnie. Jest to przydatne w przypadku tworzenia zestawów satelitarnych.

W poniższym przykładzie pokazano, jak podzielić listę elementów na partie na podstawie metadanych elementu. Lista ExampColl elementów jest podzielona na trzy partie na Number podstawie metadanych elementu. Obecność %(ExampColl.Number)w atrybucie Text powiadamia MSBuild, że należy wykonać przetwarzanie wsadowe. Lista ExampColl elementów jest podzielona na trzy partie na Number podstawie metadanych, a każda partia jest przekazywana oddzielnie do zadania.

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

Zadanie Komunikat wyświetla następujące informacje:

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

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

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

Podziel kilka list elementów na partie

Program MSBuild może podzielić wiele list elementów na partie na podstawie tych samych metadanych. Dzięki temu można łatwo podzielić różne listy elementów na partie w celu utworzenia wielu zestawów. Na przykład można mieć listę elementów plików cs podzielonych na partię aplikacji i partię zestawów oraz listę elementów plików zasobów podzielonych na partię aplikacji i partię zestawów. Następnie można użyć przetwarzania wsadowego, aby przekazać te listy elementów do jednego zadania i skompilować zarówno aplikację, jak i zestaw.

Uwaga

Jeśli lista elementów przekazywana do zadania nie zawiera żadnych elementów z przywoływanymi metadanymi, każdy element na tej liście elementów jest przekazywany do każdej partii.

W poniższym przykładzie pokazano, jak podzielić wiele list elementów na partie na podstawie metadanych elementu. ExampColl Listy elementów i ExampColl2 są podzielone na trzy partie na Number podstawie metadanych elementu. Obecność %(Number)w atrybucie Text powiadamia MSBuild, że należy wykonać przetwarzanie wsadowe. ExampColl Listy elementów i ExampColl2 są podzielone na trzy partie na Number podstawie metadanych, a każda partia jest przekazywana oddzielnie do zadania.

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

Zadanie Komunikat wyświetla następujące informacje:

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

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

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

Partia jednego elementu naraz

Przetwarzanie wsadowe można również wykonać na dobrze znanych metadanych elementu, które są przypisywane do każdego elementu podczas tworzenia. Gwarantuje to, że każdy element w kolekcji będzie miał pewne metadane do użycia do dzielenia na partie. Wartość metadanych jest przydatna Identity do dzielenia każdego elementu na liście elementów na oddzielną partię. Aby uzyskać pełną listę dobrze znanych metadanych elementu, zobacz Dobrze znane metadane elementu.

W poniższym przykładzie pokazano, jak wsadować każdy element na liście elementów pojedynczo. Lista ExampColl elementów jest podzielona na sześć partii, każda partia zawierająca jeden element listy elementów. Obecność %(Identity)w atrybucie Text powiadamia MSBuild, że należy wykonać przetwarzanie wsadowe.

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

Zadanie Komunikat wyświetla następujące informacje:

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

Nie ma jednak gwarancji, że jest unikatowa; Identity jego wartość jest obliczaną ostateczną wartością atrybutu Include . W związku z tym, jeśli jakiekolwiek Include atrybuty są używane wiele razy, są one wsadowe razem. Jak pokazano w poniższym przykładzie, ta technika wymaga Include , aby atrybuty są unikatowe dla każdego elementu w grupie. Aby zilustrować ten punkt, rozważ następujący kod:

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

Dane wyjściowe pokazują, że pierwsze dwa elementy znajdują się w tej samej partii, ponieważ Include atrybut jest taki sam dla nich:

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

Filtrowanie list elementów

Przetwarzanie wsadowe może służyć do filtrowania niektórych elementów z listy elementów przed przekazaniem ich do zadania. Na przykład filtrowanie dla dobrze znanej Extension wartości metadanych elementu umożliwia uruchomienie zadania tylko dla plików z określonym rozszerzeniem.

W poniższym przykładzie pokazano, jak podzielić listę elementów na partie na podstawie metadanych elementu, a następnie filtrować te partie po przekazaniu ich do zadania. Lista ExampColl elementów jest podzielona na trzy partie na Number podstawie metadanych elementu. Atrybut Condition zadania określa, że tylko partie z wartością Number2 metadanych elementu zostaną przekazane do zadania

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

Zadanie Komunikat wyświetla następujące informacje:

Items in ExampColl: Item2;Item5