任务批处理中的项元数据
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: "%(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 已知项元数据值进行筛选,可以仅对具有特定扩展名的文件运行某个任务。
下面的示例演示如何根据项元数据将项列表划分为多个批,然后在将这些批传递到任务中时对它们进行筛选。 根据 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