关于 MSBuild:MSBuild – 按条件获取项目列表

MSBuild - Get a list of projects by a condition

我有以下 MSBuild 任务,它为每个引用的项目并行运行"CustomBuildTask"任务:

1
2
3
4
5
6
7
8
9
10
11
12
<Target Name="CustomBuild" AfterTargets="Build">
    <ItemGroup>
      <CustomProjectReferences Include="@(ProjectReference)" />
    </ItemGroup>
    <MSBuild
      Targets="CustomBuildTask"
      BuildInParallel="$(BuildInParallel)"
      Projects="@(CustomProjectReferences)"
      Condition="'@(CustomProjectReferences)' != ''"
      ContinueOnError="true">
    </MSBuild>
</Target>

这似乎工作正常。但是,有没有一种方法可以通过在某些条件下过滤"CustomProjectReferences"来改善这一点。例如,仅选择定义了"CustomBuildTask"任务的项目或仅选择定义了某些属性的项目。

感谢您的帮助,因为我希望缩短构建时间。谢谢


正如@stijn 在他的评论中指出的那样,由 ProjectReference 项表示的项目文件每个都必须由 MSBuild 评估,以便了解其中定义的所有目标和属性。这可能不值得付出性能代价。但是,您可以通过使用 XmlPeek 任务获得所需的数据,而不会对性能造成巨大影响。根据您的需要,这对于您建议检查目标是否存在的场景可能足够可靠,但前提是该目标永远不会通过 Import 合并,也不会有 Condition 属性。属性场景会更加冒险,只有在您知道属性永远不会通过 Import 定义、永远不会在 Target 内定义或更新并且永远不会有 Condition 属性的情况下才能工作。如果你走这条路,一个有用的拼图将是项目功能,例如WithMetadataValue.