任务MSBuild如何在文件上循环 ...
任务MSBuild如何在文件上循环 ...,msbuild,Msbuild,FilesToCompile是所有.cpp文件的项目组 当我查看构建日志时,它显示了为CPPFILE中的每个文件运行的目标buildcpp 我明白这是我在逻辑上希望发生的事情,但我的问题是,元素或MSBuild模式的哪个规则导致对CPPFILE的每个值执行任务MSBuild 简言之,在文档中,它在哪里陈述了将要发生的事情 我希望将整个ItemGroup传递一次,而不是为每个项调用一次MSBuild目标。它所基于的MSBuild概念称为“批处理”-在您的情况下称为任务批处理(请参阅) 任何包含对项
FilesToCompile
是所有.cpp
文件的项目组
当我查看构建日志时,它显示了为CPPFILE
中的每个文件运行的目标buildcpp
我明白这是我在逻辑上希望发生的事情,但我的问题是,元素或MSBuild
模式的哪个规则导致对CPPFILE
的每个值执行任务MSBuild
简言之,在文档中,它在哪里陈述了将要发生的事情
我希望将整个ItemGroup
传递一次,而不是为每个项调用一次MSBuild
目标。它所基于的MSBuild概念称为“批处理”-在您的情况下称为任务批处理(请参阅)
任何包含对项目组的%()
引用的任务都将被拆分为共享相同元数据的批,并且每个批将执行一次该任务。当使用内置元数据(如Identity
或FullPath
)时,这本质上意味着“永远执行此任务”,尽管也可能有更复杂的用例。@HansPassant因此,如果我想传递整个ItemGroup
,并且只传递一次,我必须首先将其分配给属性
,然后将其设置为一次传入项目组
的@HansPassant,而不是每个项目一个任务调用。
<Target Name="Build">
...
<MSBuild
Projects="$(MSBuildProjectFile)"
Condition="'@(FilesToCompile)' != ''"
Targets="buildcpp"
Properties="CPPFILE=%(FilesToCompile.FullPath);OBJFILE=$(ObjectFolder)\%(FilesToCompile.Filename).doj;IncludeDirs=$(IncludeDirs)"
/>