Практическое руководство. Пакетная обработка задач на основе метаданных элемента
Обновлен: Ноябрь 2007
MSBuild предоставляет возможность разделения наборов элементов на разные категории, или пакеты, на основании метаданных элементов и выполнения задачи с использованием каждого пакета в отдельности. При этом не всегда удается точно определить, какие элементы передаются с каким пакетом. В данном разделе рассматриваются наиболее распространенные сценарии, включающие пакетную обработку.
Деление набора элементов на пакеты
Деление нескольких наборов элементов на пакеты
Пакетная обработка одного элемента за один раз
Фильтрация наборов элементов
Дополнительные сведения о пакетной обработке с использованием MSBuild см. в разделе Пакетная обработка в MSBuild.
Деление набора элементов на пакеты
Пакетная обработка позволяет разделить набор элементов на различные пакеты на основании метаданных элементов и передавать задаче каждый из пакетов отдельно. Это может оказаться полезным при создании вспомогательных сборок.
В следующем примере показано, как разделить набор элементов на пакеты на основании метаданных элементов. Набор элементов ExampColl делится на три пакета на основании метаданных элемента Number. Наличие %(ExampColl.Number) в атрибуте Text показывает MSBuild, что следует выполнить пакетную обработку. Набор элементов ExampColl делится на три пакета на основании метаданных Number, и каждый пакет отдельно передается задаче.
<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>
В задаче Задача Message отображается следующая информация:
Number: 1 -- Items in ExampColl: Item1;Item4
Number: 2 -- Items in ExampColl: Item2;Item5
Number: 3 -- Items in ExampColl: Item3;Item6
Деление нескольких наборов элементов на пакеты
MSBuild может разделить несколько наборов элементов на пакеты на основании одних и тех же метаданных. Это упрощает деление различных наборов элементов на пакеты для создания нескольких сборок. Например, можно создать набор элементов из файлов с расширением CS, разделенных на пакет приложения и пакет сборки, и набор элементов из файлов ресурсов, разделенных на пакет приложения и пакет сборки. Затем можно с помощью пакетной обработки передать эти наборы элементов в одну задачу и создать и приложение, и сборку.
Примечание. |
---|
Если передаваемый задаче набор элементов не содержит элементов с указанными метаданными, каждый элемент в этом наборе передается в каждый пакет. |
В следующем примере показано, как разделить множественный набор элементов на пакеты на основании метаданных элементов. Каждый из наборов элементов ExampColl и ExampColl2 делится на три пакета на основании метаданных элемента Number. Наличие %(Number) в атрибуте Text показывает MSBuild, что следует выполнить пакетную обработку. Наборы элементов ExampColl и ExampColl2 делятся на три пакета на основании метаданных Number, и каждый пакет отдельно передается задаче.
<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>
В задаче Задача Message отображается следующая информация:
Number: 1 -- Items in ExampColl: Item1 ExampColl2: Item4
Number: 2 -- Items in ExampColl: Item2 ExampColl2: Item5
Number: 3 -- Items in ExampColl: Item3 ExampColl2: Item6
Пакетная обработка одного элемента за один раз
Пакетная обработка может также выполняться по известным метаданным, которые назначаются каждому элементу при создании. Этим обеспечивается, что каждый элемент в наборе будет содержать некоторые метаданные для использования при пакетной обработке. Значение метаданных Identity уникально для каждого элемента и используется для выделения каждого элемента в наборе в отдельный пакет. Полный список известных метаданных элементов см. в разделе Общеизвестные метаданные элементов MSBuild.
В следующем примере показано, как выполнить пакетную обработку каждого элемента в наборе отдельно. Поскольку значение метаданных Identity каждого элемента уникально, набор элементов ExampColl делится на шесть пакетов, каждый из которых содержит один элемент набора элементов. Наличие %(Identity) в атрибуте Text показывает MSBuild, что следует выполнить пакетную обработку.
<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: "%(Identity)" -- Items in ExampColl: @(ExampColl)"/>
</Target>
</Project>
В задаче Задача Message отображается следующая информация:
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
Фильтрация наборов элементов
Пакетную обработку можно использовать для фильтрации определенных элементов из набора перед передачей их задаче. Например, используя фильтрацию по значению известных метаданных элемента Extension, можно выполнить задачу только для файлов с определенным расширением.
В следующем примере показано, как разделить набор элементов на пакеты на основании метаданных элементов, а затем отфильтровать эти пакеты при передаче их задаче. Набор элементов ExampColl делится на три пакета на основании метаданных элемента Number. Атрибут Condition задачи указывает, что задаче будут переданы только пакеты, для которых метаданные элемента Number имеют значение 2.
<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>
В задаче Задача Message отображается следующая информация:
Items in ExampColl: Item2;Item5
См. также
Основные понятия
Ссылки
Общеизвестные метаданные элементов MSBuild
Элемент ItemMetadata (MSBuild)