Поделиться через


Пакетная обработка в 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)

Другие ресурсы

Основные возможности MSBuild

Справочные сведения о MSBuild

Дополнительные возможности MSBuild