ItemGroup包含具有条件的文件

Ste*_*ens 4 msbuild

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

我的用例是我想创建一个所有.csproj文件的集合,其中.nuspec存在一个具有相同名称的文件(没有扩展名).

- root_dir\
    - build.proj
    - Project1\
        - Project1.csproj
        - Project1.nuspec
    - Project2\
        - Project2.csproj
    - Project3\
        - Project3.csproj
        - Project3.nuspec
Run Code Online (Sandbox Code Playgroud)

我尝试用MSBuild转换来做这个,但那不起作用.

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

ProjectWithNuspec评估条件之前,似乎没有初始化该项.

我确实想办法分两步完成:

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

理想情况下,我希望能够一步到位.

Mic*_*ker 6

您基本上这样做是可以在MSBuild中表达的最佳方式.对于这些类型的变换,您几乎总是需要一个中间项组,您可以将其他变换分层.把它想象成一个管道,首先你需要所有文件(这些都进入组1),现在我需要组1中的所有文件,这些文件也匹配其他条件(组2).

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

</ItemGroup>
Run Code Online (Sandbox Code Playgroud)