的MSBuild - 如何做任务的MSBuild遍历文件
问题描述:
<Target Name="Build">
...
<MSBuild
Projects="$(MSBuildProjectFile)"
Condition="'@(FilesToCompile)' != ''"
Targets="buildcpp"
Properties="CPPFILE=%(FilesToCompile.FullPath);OBJFILE=$(ObjectFolder)\%(FilesToCompile.Filename).doj;IncludeDirs=$(IncludeDirs)"
/>
FilesToCompile
是所有.cpp
文件的ItemGroup
。的MSBuild - 如何做任务的MSBuild遍历文件
当我查看构建日志时,它显示CPPFILE
中每个文件都运行的目标buildcpp
。
我明白,这就是我想在逻辑上发生,但我的问题是,什么规则元素<MSBuild>
或MSBuild
架构原因任务MSBuild
的要为CPPFILE
每个值执行?
简而言之,在文档中哪些地方会说明会发生什么?
我想整个传递ItemGroup
一次,而不是每个项目调用MSBuild
目标一次。
答
这是基于msbuild概念被称为“批处理” - 在你的情况任务批处理(见MSBuild's task batching documentation)。
包含对项目组的%()
引用的任何任务都将被拆分为共享相同元数据的批次,并且该任务将针对每个批次执行一次。当使用Identity
或FullPath
等内置元数据时,这基本上意味着“为任何项目执行此任务”,但也可能有更复杂的用例。
@HansPassant所以如果我想传入一个完整的ItemGroup并且只有一次,我必须先将它分配给一个'Property',然后将其设置为等于'
Adrian
@HansPassant我想一次传递一个'ItemGroup',而不是每个项目的一个任务调用。 – Adrian
https://msdn.microsoft.com/en-us/library/ms171473.aspx?f=255&MSPPError=-2147217396 – stijn