【问题标题】:How does task MSBuild loop over files任务 MSBuild 如何循环文件
【发布时间】:2019-10-22 05:44:32
【问题描述】:
<Target Name="Build">
...

    <MSBuild
            Projects="$(MSBuildProjectFile)"
            Condition="'@(FilesToCompile)' != ''"
            Targets="buildcpp"
            Properties="CPPFILE=%(FilesToCompile.FullPath);OBJFILE=$(ObjectFolder)\%(FilesToCompile.Filename).doj;IncludeDirs=$(IncludeDirs)"
        />

FilesToCompile 是所有 .cpp 文件中的一个 ItemGroup

当我查看构建日志时,它显示目标 buildcpp 正在为 CPPFILE 中的每个文件运行。

我知道这是我在逻辑上想要发生的事情,但我的问题是,元素 &lt;MSBuild&gt;MSBuild 架构的 规则 导致任务 MSBuild 为每个值执行CPPFILE?

简而言之,文档中的什么地方说明了会发生什么?

我想传递整个 ItemGroup 一次,而不是为每个项目调用一次 MSBuild 目标。

【问题讨论】:

  • @HansPassant 所以如果我想传递整个ItemGroup 并且只传递一次,我必须先将其分配给Property,然后将其设置为等于&lt;MSBuild Properties 属性?
  • @HansPassant 我想一次性传入ItemGroup,而不是每个项目调用一个任务。

标签: msbuild


【解决方案1】:

此基于的 msbuild 概念称为“批处理”-在您的情况下为任务批处理(请参阅MSBuild's task batching documentation)。

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

【讨论】:

    猜你喜欢
    • 2011-11-27
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多