2017-10-05 66 views
0
<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目标一次。

+0

@HansPassant所以如果我想传入一个完整的ItemGroup并且只有一次,我必须先将它分配给一个'Property',然后将其设置为等于' Adrian

+0

@HansPassant我想一次传递一个'ItemGroup',而不是每个项目的一个任务调用。 – Adrian

+0

https://msdn.microsoft.com/en-us/library/ms171473.aspx?f=255&MSPPError=-2147217396 – stijn

回答

1

这是基于msbuild概念被称为“批处理” - 在你的情况任务批处理(见MSBuild's task batching documentation)。

包含对项目组的%()引用的任何任务都将被拆分为共享相同元数据的批次,并且该任务将针对每个批次执行一次。当使用IdentityFullPath等内置元数据时,这基本上意味着“为任何项目执行此任务”,但也可能有更复杂的用例。