Пакетная обработка в MSBuild
В MSBuild можно разделять списки элементов на разные категории, или пакеты, на основании метаданных элементов и выполнять целевой объект или задачу с использованием каждого пакета в отдельности.
Пакетная обработка задач
Пакетная обработка задач позволяет упростить файлы проекта, предоставляя способ разделения списков элементов на различные пакеты и передачи каждого пакета задаче отдельно. Это означает, что в файле проекта необходимо только один раз объявить задачу и ее атрибуты, даже если задача выполняется несколько раз.
Используя запись %(ItemMetaDataName) в одном из атрибутов задачи, вы указываете, что MSBuild следует выполнить пакетную обработку задачи. В приведенном ниже примере список элементов Example разделяется на пакеты на основании значения метаданных элемента Color, и каждый из пакетов отдельно передается в задачу MyTask.
Примечание
Если ссылка на список элементов не используется в каких-либо других атрибутах задачи, или имя метаданных может оказаться неоднозначным, можно использовать запись %(ItemCollection.ItemMetaDataName), чтобы полностью определить значение метаданных элемента, которое будет использоваться для пакетной обработки.
<Project
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Example Include="Item1">
<Color>Blue</Color>
</Example>
<Example Include="Item2">
<Color>Red</Color>
</Example>
</ItemGroup>
<Target Name="RunMyTask">
<MyTask
Sources = "@(Example)"
Output = "%(Color)\MyFile.txt"/>
</Target>
</Project>
Другие характерные примеры пакетной обработки см. в разделе Метаданные элементов в пакетной обработке задач.
Пакетная обработка целевых объектов
Прежде чем выполнять целевой объект, MSBuild проверяет актуальность входных и выходных данных целевого объекта. Если и входные, и выходные данные актуальны, целевой объект пропускается. Если пакетная обработка используется в задаче, находящейся внутри целевого объекта, MSBuild требуется определить, являются ли актуальными входные и выходные данные для каждого пакета элементов. Иначе целевой объект выполняется каждый раз.
В следующем примере показан элемент Target, содержащий атрибут Outputs с записью %(ItemMetaDataName). MSBuild разделит список элементов Example на пакеты на основании значения метаданных элемента Color и проанализирует отметки времени выходных файлов для каждого пакета. Если выходные данные из пакета неактуальны, целевой объект выполняется. В противном случае целевой объект пропускается.
<Project
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Example Include="Item1">
<Color>Blue</Color>
</Example>
<Example Include="Item2">
<Color>Red</Color>
</Example>
</ItemGroup>
<Target Name="RunMyTask"
Inputs="@(Example)"
Outputs="%(Color)\MyFile.txt">
<MyTask
Sources = "@(Example)"
Output = "%(Color)\MyFile.txt"/>
</Target>
</Project>
Другой пример пакетной обработки целевого объекта см. в разделе Метаданные элементов в пакетной обработке целевых объектов.
Функции свойств, использующие метаданные
Управлять пакетной обработкой можно с помощью функций свойств, включающих метаданные. Например:
$([System.IO.Path]::Combine($(RootPath),%(Compile.Identity)))
используется функция Combine для объединения пути к корневой папке с путем к элементу Compile.
Функции свойств не могут использоваться в значениях метаданных. Например:
%(Compile.FullPath.Substring(0,3))
не допускается.
Дополнительные сведения о функциях свойств см. в разделе Функции свойств.
См. также
Ссылки
Элемент ItemMetadata (MSBuild)