所以我有點在MSBuild中寫作的竅門。如何使用MSBuild ItemGroup成員作爲單獨的項目,如屬性?
我喜歡在ItemGroups中存儲事物的想法,因爲它很容易迭代,並且可以有多個字段。
這使得它們有點像一個類(更像結構體),但它們以一種感覺像lambda表達式的方式響應目標和任務的迭代語法。
但是我繼續遇到這種情況,我想訪問項目組中特定項目的值,即像訪問屬性一樣訪問它。
在這種情況下,我遇到了如何隔離組中單個項目的問題。
當項目組在目標或任務中進行批處理時,由於使用元數據名稱尋址或由於使用公共項目組名稱尋址,因此可以使用「當前」項目的值,即@(ItemsName)或%(MetaDataName)。
但我想要做的事情是:使用Item組作爲System.Configuration類,它包含配置文件的一部分中的條目的值。因此,正常情況下,將ItemGroup自身命名爲與配置文件中的節名相匹配。但是,ItemGroup不是可通過構建引擎接口訪問的可尋址元素,只有項目本身是可尋址的。
單獨命名項目組中的項目可能會很好,而不是將它們命名爲完全相同,並使用包含或元數據字段來區分它們。這使得它們的行爲類似於屬性,因爲它們可以單獨作爲不同的項目進行尋址。所以你可以很容易地在條件中使用它們的值:'(UniqueItemName - >'%(Value)')。
但是,然後,可迭代的功能實質上丟失了。
爲了縮小這個範圍,假設我有一個配置文件,通過和xml任務讀取到一個Item組中,以便節中的元素名稱成爲項目組中項目的名稱和每個配置文件的屬性元素是成爲元數據屬性:
<configItemFlag name="displayDebugMessages" value="true" note="use with abandon" />
<configItemFlag name="displaySecurityValueMessages" value="false" note="use with caution" />
當我想在一個條件來測試這一點,我需要縮小它是這樣的:
<Messge Text="Debug Message: you are debugging!" Condition="'@(configItemFlag->'%(Name)')' == 'displayDebugMessages' AND '@(configItemFlag->'%(Value)')' == 'true'/>
但是,這只是評估比較頻繁不會評估爲單個布爾值EAN。
那麼有沒有什麼辦法可以把它歸結爲一個可靠的測試?
我被迫同意。我相信你的回答表明,'擴展'包解決了開發人員希望在構建腳本中添加不直接關注正常VS解決方案或項目文件中指定的操作的邊界情況。這是擴展旨在使MSBuild成爲更通用的腳本語言。然而,你的回答指出,我所要求的是一種'注意力',這是一種針對語言核心特徵的擴展,在這種情況下,擴展到核心數據結構。 – 2011-03-04 18:31:40