2012-03-27 76 views
1

考虑一个MSBuild项目中的项目类型FooItemMSBuild与物品元数据的微妙?

在一个任务中,我们可以对项目及其元数据的引用,例如:

%(FooItem.BarMetadata) 

@(FooItem->'Metadata("BarMetadata")') 

@(FooItem->'%(BarMetadata)') 

是否有这三种方法之间的差异,这与我看起来完全相同?很明显,转换语法(->)通常功能更强大,但我已经明确给出了一个简单的例子,它等价于使用%运算符,从我所知道的。

此外,这里是否对任务批处理有任何影响(假定这些表达式在任务项目内)?一般来说,我想知道是否有任何方法可以阻止元数据的任务批量处理,同时仍然引用任务中的某些元数据。

回答

3

还有不是相同。转换语法将输入附加到以分号分隔的Items数组。 %表示法将输入添加到ItemGroup Element

考虑以下目标:

<Target Name="TestMetadata"> 

    <ItemGroup> 
    <Files Include="File1.doc"> 
     <Description>Word Document</Description> 
    </Files> 
    <Files Include="File2.xls"> 
     <Description>Excel Document</Description> 
    </Files> 
    <Files Include="File3.pps"> 
     <Description>PowerPoint Presentation</Description> 
    </Files> 
    </ItemGroup> 

    <Message Text="Transform: @(Files->'%(FullPath) is %(Description)')" /> 
    <Message Text="Direct: %(Files.FullPath) is %(Files.Description)" /> 

</Target> 

由于输出显示,那些符号产生不同的输出:

TestMetadata: 
Transform: C:\MSBuild\File1.doc is Word Document;C:\MSBuild\File2.xls is Excel Document;C:\\MSBuild\File3.pps is PowerPoint Presentation 
Direct: C:\MSBuild\File1.doc is Word Document 
Direct: C:\MSBuild\File2.xls is Excel Document 
Direct: C:\MSBuild\File3.pps is PowerPoint Presentation
+0

所以基本上你的意思是,变换语法(' - >' )不会执行任何批处理任务,而'%'确实......似乎所有,对吧? – Noldorin 2012-03-27 19:57:46

+0

不可以。您可以将两者用于批处理,因为它们之间很少。当我需要简单的非格式化字符串数组时,我会使用' - >'。 – KMoraz 2012-03-27 20:35:15

+0

但很明显,它*在第一种情况下是配料,而不是在第二种情况下。解释一下。 – Noldorin 2012-03-27 20:41:40