任务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)"
        />