【问题标题】:ItemGroup include files with conditionItemGroup 包含有条件的文件
【发布时间】:2015-07-21 03:07:59
【问题描述】:

在 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 元素内?当您使用 ItemGroup Remove... 时,我假设一个 Target 元素...
  • 在目标元素内。

标签: msbuild


【解决方案1】:

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

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

</ItemGroup>

【讨论】:

  • 我忘了%(RecursiveDir)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 2021-05-19
    • 2018-02-10
    • 2020-12-29
    • 1970-01-01
    • 2011-11-27
    • 2012-03-15
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多