文章出處

在軟件項目不斷的進展中,MSBuild 腳本可能幾個月都不會被修改,因為通常編譯和發布的目錄是不經常變化的。

但,一旦某天你需要修改了,看到那一堆 $(Something)、 @(Something)、%(Something) 是相當的頭大,不得不搜索 MSDN 才能找到合理的用法。

每次看到下面這樣的語法,我都感覺,有必要把語法設計成這樣嗎?

1 <Copy SourceFiles="@(SrcFiles)" DestinationFiles="@(SrcFiles->'c:\DestDir\%(RecursiveDir)%(Filename)%(Extension)')" />

這篇文章將對 PropertyGroup、ItemGroup 和 ItemMetadata 做簡單的語法介紹,解救未來的自己。

PropertyGroup 和 $ 符號

PropertyGroup 用于標記一個或多個變量值。ProperyGroup 內的 XML 節點屬性(Property)可以用任何字符串命名。

屬性可以通過 $(OtherPropertyName) 語法來引用其他屬性的的值。同樣,在其他位置使用相同方式引用屬性值。

1 <PropertyGroup>
2   <BaseFolder>C:\my\folder</BaseFolder>
3   <SettingsFile>$(BaseFolder)\settings\app.xml</SettingsFile>
4 </PropertyGroup>
5 <Message Text="Using settings file found at $(SettingsFile)"/>

上面的 Message 命令的輸出結果為:

1 Using settings file found at C:\my\folder\settings\app.xml

ItemGroup 和 @ 符號

ItemGroup 用于標記一個包含多個值的變量,類似于 C# 中的 Array 或 Dictionary 等。

1 <ItemGroup>
2   <MyItems Include="First" />
3   <MyItems Include="Second;Third;" />
4   <MyItems Include=";;;;Fourth;;" />
5 </ItemGroup>
6 <Message Text="My items using dollar: $(MyItems)"/>
7 <Message Text="My items using at symbol: @(MyItems)"/>

上面的命令輸出的結果為:

1 My items using dollar:
2 My items using at symbol: First;Second;Third;Fourth

我們看到,如果使用 $ 符號只能得到一個空字符串。而使用 @ 符號則將輸出以 ";" 分號分割的字符串。

同時,MSBuild 也幫我們過濾了多余的 ";" 字符。

ItemMetadata 和 % 符號

ItemGroup 不但可以被用于列表數據,還可以用于 key/value 字典。

在 MSBuild 中 key/value 被稱為 ItemMetadata。

 1 <ItemGroup>
 2   <People Include="Joe">
 3     <Email>joe@example.com</Email>
 4   </People>
 5   <People Include="Bill">
 6     <Email>bill@example.com</Email>
 7   </People>
 8   <People Include="Oscar">
 9     <Email>oscar@example.com</Email>
10   </People>
11 </ItemGroup>
12 <Message Text="Processing person %(People.Identity) with email %(People.Email)"/>

上面的命令輸出的結果為:

1 Processing person Joe with email joe@example.com
2 Processing person Bill with email bill@example.com
3 Processing person Oscar with email oscar@example.com

在 %(ItemGroup.MetadataKey) 語法中,"Identity" 代表著 XML 節點中的 "Include" 屬性中的值。

同時,我們發現,雖然只寫了一句 Message 命令,但是有 3 條輸出。這是利用的 MSBuild 中的 Task Batching 功能。

那還有哪些 Item Metadata Key 呢?參考這里 :MSBuild Well-known Item Metadata

參考資料

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()