2017-10-05 87 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等內置元數據時,這基本上意味着「爲任何項目執行此任務」,但也可能有更復雜的用例。