2011-09-01 22 views
2

我有一个目标内定义的目录列表其他的ItemGroup:变换的ItemGroup与通配符

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

这是bug还是我失去了一些东西?

回答

3

试试这个,它会使用任务配料正确地创建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)

+0

不幸的是它阻止了一会儿,然后用模具OutOfMemoryException异常。 –

+0

划痕,它的工作原理!忘记了''**'扩大了的'.Identity'。 不幸的是,由于其他问题,使用ItemGroups仍然是一个严重的PITA。 MSBuild可能是有史以来设计的最差的构建系统。 –

+0

我已经将此标记为答案,但它仍然很好地知道为什么变换不起作用(如果它是一个错误 - 我认为我在MSDN上看到了一些表示这两个表单应该等同的东西)。 –