<Target Name="Build">
...
<MSBuild
Projects="$(MSBuildProjectFile)"
Condition="'@(FilesToCompile)' != ''"
Targets="buildcpp"
Properties="CPPFILE=%(FilesToCompile.FullPath);OBJFILE=$(ObjectFolder)\%(FilesToCompile.Filename).doj;IncludeDirs=$(IncludeDirs)"
/>
FilesToCompile
是所有ItemGroup
个文件的.cpp
。
当我查看构建日志时,它会显示buildcpp
中每个文件的目标CPPFILE
。
我理解这是我逻辑上想要发生的事情,但我的问题是,元素<MSBuild>
或MSBuild
架构的规则会导致任务MSBuild
是为CPPFILE
的每个值执行?
简而言之,文档中的哪个位置表明将会发生什么?
我想传递整个ItemGroup
一次,而不是每个项目都调用一次MSBuild
目标。
答案 0 :(得分:1)
这是基于的msbuild概念称为“批处理” - 在您的案例中任务批处理(参见MSBuild's task batching documentation)。
任何包含对项目组的%()
引用的任务将被拆分为共享相同元数据的批处理,并且每个批处理将执行一次任务。当使用内置元数据(如Identity
或FullPath
)时,这实质上意味着“执行此任务永远的项目”,但也可能有更复杂的用例。