ItemGroup包含具有条件的文件

时间:2015-05-10 16:17:31

标签: msbuild

在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. 删除不符合条件的文件
  3. <ItemGroup>
        <ProjectWithNuspec Include="*\*.csproj">
        <ProjectWithNuspec Remove="%(ProjectWithNuspec.Identity)"
                           Condition="!Exists('@(ProjectWithNuspec->'%(Filename).nuspec')')">
    </ItemGroup>
    

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

2 个答案:

答案 0 :(得分:6)

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

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

</ItemGroup>

答案 1 :(得分:0)

条件元素可用于正则表达式。 请参阅this answer