ItemGroup 包含有条件的文件

ItemGroup include files with condition

在 MSBuild 12.0 中,是否可以仅在满足条件时将文件包含在 <ItemGroup> 中?

我的用例是我想创建一个包含所有 .csproj 个文件的集合,其中存在 .nuspec 个同名文件(不带扩展名)。

- root_dir\
    - build.proj
    - Project1\
        - Project1.csproj
        - Project1.nuspec
    - Project2\
        - Project2.csproj
    - Project3\
        - Project3.csproj
        - Project3.nuspec

我尝试使用 MSBuild 转换来执行此操作,但没有成功。

<ItemGroup>
    <ProjectWithNuspec Include="*\*.csproj"
                       Condition="Exists('@(ProjectWithNuspec->'%(Filename).nuspec')')">
</ItemGroup>

项目 ProjectWithNuspec 似乎没有在评估条件之前初始化。

我确实找到了分两步完成的方法:

  1. 包括所有文件
  2. 删除不符合条件的文件
<ItemGroup>
    <ProjectWithNuspec Include="*\*.csproj">
    <ProjectWithNuspec Remove="%(ProjectWithNuspec.Identity)"
                       Condition="!Exists('@(ProjectWithNuspec->'%(Filename).nuspec')')">
</ItemGroup>

理想情况下,我希望能够一步完成。

您基本上是以 MSBuild 中可以表达的最佳方式来执行此操作。对于这些类型的转换,您几乎总是需要一个中间项目组,您可以将其他转换分层到该中间项目组。把它想象成一个管道,首先你需要所有文件(这些文件进入第 1 组),现在我需要第 1 组中的所有文件,这些文件也符合其他一些条件(第 2 组)。

<ItemGroup>
    <AllProjects Include="$(MyDir)\**\*.csproj" />        
    <AllProjectsWithNuspec Include="@(AllProjects)"
                           Condition="Exists('%(RecursiveDir)%(FileName).nuspec')"  />

</ItemGroup>

Condition元素可以使用正则表达式。 请参考.