任务批处理中的项元数据

MSBuild 能够根据项元数据将项列表划分为不同的类别或批,并在每批中一次运行一个任务。 清楚地了解哪个批具体传递了什么项目很困难。 本主题介绍了涉及批处理的下列常见情形。

  • 将一个项列表划分为多个批

  • 将多个项列表划分为多个批

  • 一次批处理一个项

  • 筛选项列表

有关使用 MSBuild 进行批处理的更多信息,请参见 MSBuild 批处理

将一个项列表划分为多个批

批处理使您能够根据项元数据将一个项列表划分为不同的批,并将各个批分别传递到任务中。 这对于生成附属程序集很有用。

下面的示例演示如何根据项元数据将一个项列表划分为多个批。 根据 Number 项元数据,将 ExampColl 项列表划分为三个批。 Text 特性中存在的 %(ExampColl.Number) 通知 MSBuild 应执行批处理。 根据 Number 元数据将 ExampColl 项列表划分为三个批,并将各个批分别传递到任务中。

<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 文件的项列表划分为一个应用程序批和一个程序集批,将一个资源文件的项列表划分为一个应用程序批和一个程序集批。 然后,可以使用批处理来将这些项列表传递到一个任务中,生成应用程序和程序集。

备注

如果传递到任务中的项列表不包含具有引用的元数据的项,则该项列表中的每个项都将传递到每个批中。

下面的示例演示如何根据项元数据将多个项列表划分为多个批。 根据 Number 项元数据,将 ExampColl 和 ExampColl2 项列表分别划分为三个批。 Text 特性中存在的 %(Number) 通知 MSBuild 应执行批处理。 根据 Number 元数据,将 ExampColl 和 ExampColl2 项列表划分为三个批,并将各个批分别传递到任务中。

<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 项列表被划分为六个批,每个批都包含项列表的一个项。 Text 特性中存在的 %(Identity) 通知 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: &quot;%(Identity)&quot; -- 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 已知项元数据值进行筛选,可以仅对具有特定扩展名的文件运行某个任务。

下面的示例演示如何根据项元数据将项列表划分为多个批,然后在将这些批传递到任务中时对它们进行筛选。 根据 Number 项元数据,将 ExampColl 项列表划分为三个批。 任务的 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 常见的项元数据

Item 元素 (MSBuild)

ItemMetadata 元素 (MSBuild)

概念

MSBuild 批处理

其他资源

MSBuild 概念

MSBuild 参考