2012-03-27 77 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