项目组包含条件文件

6
在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>

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

你是在Target元素内还是在Project元素内?我假设你是在Target元素内,因为你正在使用ItemGroup Remove... - Michael Baker
目标元素内部。 - Steven Liekens
2个回答

8

你基本上已经以MSBuild能够表达的最佳方式来完成这个任务了。对于这类转换,你几乎总是需要一个中间项目组,然后在其上叠加其他转换。可以将其视为管道,首先需要所有文件(这些文件放入组1),现在我需要来自组1的所有文件,它们还满足其他某些条件(组2)。

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

</ItemGroup>

1
我忘了 %(RecursiveDir) - Steven Liekens

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接