【问题标题】:Remove directory from MSBuild ItemGroup从 MSBuild ItemGroup 中删除目录
【发布时间】:2015-02-09 13:28:23
【问题描述】:

我想在给定目录中创建一个包含所有 bin 目录的 ItemGroup,不包括给定子目录中的所有 bin 目录,例如:

MyDirectory\
  bin\
  ext\
    bin\
  lib\
    lib1\
      bin
  samples\
    sample1\
      bin\
  src\
    bin\

我想删除MyDirectory中所有的bin目录,不包括ext和lib的所有bin目录(即删除samples\sample1\bin和src\bin)。

这是我最初想出的:

<ItemGroup>
  <ExcludedDirs Include="$(MyDirectory)\ext" />
  <ExcludedDirs Include="$(MyDirectory)\lib" />

  <BinDirs Include="$(MyDirectory)\**\bin" />
  <BinDirs Remove="$(MyDirectory)\%(ExcludedDirs.Identity)\**" />
</ItemGroup>

由于MSBuild - ItemGroup of all bin directories within subdirectories 这不起作用,这就是我想出以下内容的原因:

<ItemGroup>
  <ExcludedDirs Include="$(MyDirectory)\ext" />
  <ExcludedDirs Include="$(MyDirectory)\lib" />

  <BinDirs Include="$([System.IO.Directory]::GetDirectories(&quot;$(SolutionDirectory)&quot;,&quot;bin&quot;, SearchOption.AllDirectories))" />
  <BinDirs Remove="$(MyDirectory)\%(ExcludedDirs.Identity)\**" />
</ItemGroup>

现在所有的 bin 目录都在 BinDirs 中,但是 ext 和 lib 中的 bin 目录排除在外。解决办法是什么?

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    获得以下见解:

    • ItemGroup 的 Remove 无法在目录中使用通配符
    • 有一个 Exclude 参数,但是它也不支持目录上的通配符

    因此:首先创建一个排除目录的无通配符列表:

    <ItemGroup>
      <_ExcludedDirs Include="ext" />
      <_ExcludedDirs Include="lib" />
    
      <ExcludedDirs Include="$([System.IO.Directory]::GetDirectories(&quot;$(MyDirectory)\%(_ExcludedDirs.Identity)&quot;,&quot;bin&quot;, SearchOption.AllDirectories))"/>
    </ItemGroup>
    

    之后将其用作 ItemGroup 的 Exclude 参数的参数:

    <BinDirs Include="$([System.IO.Directory]::GetDirectories(&quot;$(SolutionDirectory)&quot;,&quot;bin&quot;, SearchOption.AllDirectories))" Exclude="@(ExcludedDirs)" />
    

    希望有人可以使用它!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多