如何:使用项元数据对任务进行批处理

更新:2007 年 11 月

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 批处理

参考

MSBuild 常见项的元数据

Item 元素 (MSBuild)

ItemMetadata 元素 (MSBuild)

其他资源

MSBuild 概念

MSBuild 参考