<Target Name="Build">
...
<MSBuild
Projects="$(MSBuildProjectFile)"
Condition="'@(FilesToCompile)' != ''"
Targets="buildcpp"
Properties="CPPFILE=%(FilesToCompile.FullPath);OBJFILE=$(ObjectFolder)%(FilesToCompile.Filename).doj;IncludeDirs=$(IncludeDirs)"
/>
FilesToCompile
是所有.cpp
文件的ItemGroup
。
当我查看构建日志时,它显示了CPPFILE
中每个文件正在运行的目标buildcpp
。
我知道这是我在逻辑上想要发生的事情,但我的问题是,元素<MSBuild>
或MSBuild
模式的什么规则导致为每个值执行任务MSBuild
CPPFILE
?
简而言之,文档中的哪个地方说明将要发生的事情?
我想传入整个ItemGroup
一次,而不是为每个项目调用一次MSBuild
目标。
它所基于的 msbuild 概念称为"批处理" - 在你的例子中是任务批处理(请参阅 MSBuild 的任务批处理文档)。
任何包含对物料组的%()
引用的任务都将拆分为共享相同元数据的批次,并且每个批次将执行一次任务。当使用内置元数据(如 Identity
或 FullPath
)时,这本质上意味着"为永远的项目执行此任务",尽管也可能有更复杂的用例。