如何:使用项元数据对任务进行批处理
更新: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: "%(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