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ą Number
2
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