2017-10-05 3 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が表示されます。

私はそれが仕事MSBuildCPPFILEの各値に対して実行されるものを要素<MSBuild>またはMSBuildスキーマ原因のルール、私は論理的に起こるしたいが、私の質問が何であるかであることを理解?

簡潔に言えば、ドキュメントのどこにそれが起こるかが書かれていますか?

MSBuildターゲットを1回ずつ呼び出すのではなく、ItemGroup全体を1回渡します。

+0

@ HansPassantだから、 'ItemGroup'全体を一度だけ渡したいのであれば、まずそれを' Property'に割り当ててから ' Adrian

+0

@ HansPassantアイテムごとに1つのタスクコールではなく、一度に 'ItemGroup'を一度に渡したいと思います。 – Adrian

+0

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

答えて

1

これは「バッチ処理」と呼ばれるmsbuildの概念です。あなたのケースのバッチ処理では(MSBuild's task batching documentation参照)。

アイテムグループへの参照を含むタスクは、同じメタデータを共有するバッチに分割され、タスクはバッチごとに1回実行されます。 IdentityまたはFullPathのような組み込みメタデータを使用する場合、これは本質的には「このアイテムを永久に実行する」ことを意味しますが、より複雑なユースケースもあります。