【问题标题】:transform itemgroup into another itemgroup with wildcards使用通配符将 itemgroup 转换为另一个 itemgroup
【发布时间】:2011-09-01 08:53:27
【问题描述】:

我有一个在目标中定义的目录列表:

<Target>
  <ItemGroup>
    <FooDirs Include="Foo\Dir1" />
    <FooDirs Include="Foo\Dir2" />
  </ItemGroup>
<Target>

现在我想创建@(FooDirs)中所有文件的列表:

<ItemGroup>
  <FooFiles Include="@(FooDirs -> '%(Identity)\**\*')" />
</ItemGroup>

不幸的是,这不起作用,结果列表包含文字字符串:"Foo\Dir1\**\*;Foo\Dir2\**\*"。 但是,如果我使用已弃用的 &lt;CreateItem&gt; 任务,它可以正常工作:

<CreateItem Include="@(FooDirs -> '%(Identity)\**\*')">
  <Output TaskParameter="Include" ItemName="FooFiles" />
</CreateItem>

这是一个错误还是我遗漏了什么?

【问题讨论】:

    标签: xml msbuild


    【解决方案1】:

    试试这个,它会使用任务批处理正确创建 FooFiles:

    <Target Name="Foo"> 
       <ItemGroup> 
          <FooDirs Include="Foo\Dir1" /> 
          <FooDirs Include="Foo\Dir2" /> 
       </ItemGroup> 
       <ItemGroup> 
          <FooFiles Include="%(FooDirs.Identity)\**\*" />
       </ItemGroup> 
       <Message Text="%(FooFiles.Identity)" />
    </Target> 
    

    (摘自《MSBuild Trickery》技巧#5一书)

    【讨论】:

    • 不幸的是,它阻塞了一段时间,然后因 OutOfMemoryException 而死。
    • 从头开始,它有效!我忘记了.Identity 导致扩展到\**。可悲的是,由于其他问题,使用 ItemGroups 仍然是一个严重的 PITA。 MSBuild 可能是有史以来设计的最糟糕的构建系统。
    • 我已将此标记为答案,尽管很高兴知道为什么转换不起作用(如果它是一个错误 - 我想我在 MSDN 上看到了一些东西说这两种形式都应该是等价的)。
    猜你喜欢
    • 2011-12-15
    • 2018-02-08
    • 1970-01-01
    • 2010-10-30
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多