将一个 itemgroup 转化为另一个带有通配符的 itemgroup。

3

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

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

现在我想创建一个包含所有文件的列表,其中包括@(FooDirs)中的文件:
<ItemGroup>
  <FooFiles Include="@(FooDirs -> '%(Identity)\**\*')" />
</ItemGroup>

很不幸,此方法无效,导致列表包含文字字符串:"Foo\Dir1\**\*;Foo\Dir2\**\*"。 然而,如果使用已弃用的<CreateItem>任务,则可以正常工作:

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

这是一个错误还是我漏了什么?
1个回答

5

尝试使用任务批处理来创建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 技巧》一书,技巧 #5)

不幸的是,它会阻塞一段时间,然后因为OutOfMemoryException而崩溃。 - Marcin Wisnicki
算了,它能工作了!我忘记了.Identity,这导致了扩展到\ **。 不幸的是,由于其他问题,使用ItemGroups仍然是一个严重的痛点。MSBuild可能是有史以来最糟糕的构建系统。 - Marcin Wisnicki
我已将此标记为答案,但仍然希望知道为什么 transform 不起作用(如果这是一个错误-我认为我在 MSDN 上看到过说两种形式应该是等效的)。 - Marcin Wisnicki

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