2010-09-02 29 views
0

我想知道爲什麼在下面的代碼中,MsBuild拒絕設置後綴元數據。它可以使用CreateItem任務而不是ItemGroup聲明(因爲CreateItem是在構建時計算的),但我不能在這裏這樣做,因爲此代碼位於「屬性文件」中:項目沒有目標,它只是一堆我在實際項目中包含的物業/物品。MsBuild中項目的評估範圍和順序

<ItemGroup> 
     <Layout Include="Bla"> 
      <PartnerCode>bla</PartnerCode> 
     </Layout> 
     <Layout Include="Bli"> 
      <PartnerCode>bli</PartnerCode> 
     </Layout> 
</ItemGroup> 

<ItemGroup Condition="'$(LayoutENV)'=='Preprod'"> 
     <LayoutFolder Include="Preprod"> 
      <Destination>..\Compil\layout\pre\</Destination> 
     </LayoutFolder> 
</ItemGroup> 


<ItemGroup> 
    <Destinations Include="@(LayoutFolder)" > 
     <Suffix>%(Layout.PartnerCode)</Suffix> 
    </Destinations> 
</ItemGroup> 

目的地建好了,但未設置後綴元數據。

至於現在,我已經在每個需要它的項目中複製了Destinations Definition,但它並不是很乾淨。如果有人有更好的解決方案,我很感興趣!

回答

0

看來我嘗試在不可能的目標之外動態設置元數據。 我嘗試通過對佈局項目進行批處理來設置後綴元數據,但在完成批處理時佈局項目未正確設置。批處理是在msbuild解析我的屬性文件時完成的,它不會等待佈局被聲明。不過,像MadGnome指出的那樣,我可以對LayoutFolder(這是我的包含的源項)進行批處理,因爲MSBuild確實在等待它的聲明。

2

隨着MSBuild 4,你可以使用以前項的元數據項聲明是這樣的:

<ItemGroup> 
    <Layout Include="Bla"> 
     <PartnerCode>bla</PartnerCode> 
    </Layout> 
    <Layout Include="Bli"> 
     <PartnerCode>bli</PartnerCode> 
    </Layout> 
</ItemGroup> 

<ItemGroup> 
    <Destinations Include="@(Layout)" > 
     <Suffix>%(PartnerCode)</Suffix> 
    </Destinations> 
</ItemGroup> 

(很奇怪,你批上LayoutFolder,並試圖讓Layout元你要爲後綴喇嘛什麼樣的價值。或bli?)

+0

其實,我可以。我做了好幾次。如果您明確寫入要批量處理的項目組名稱(如%(LAYOUT.PartnerCode)),那很好。 但是,如果不在目標元素中,也許我無法進行批處理... – 2010-09-03 09:32:01

+0

如果您在Destinations.Suffix中編寫%(Layout.PartnerCode),您要什麼值? bla或bli? – 2010-09-03 09:48:40

+0

比方說Layout.Count = n。我想要一個包含2n個物品的集合:佈局中的所有物品,一次是bla,另一個是bli。 – 2010-09-06 07:51:48

0

您遇到的問題是您指的是列表中的元數據。 %(Layout.PartnerCode)遍歷「佈局」的ItemGroup,在這種情況下返回2個項目。即使使用1,它也會導致不希望的意外結果,因爲您指向列表。 MSBuild返回兩個元標記,並不知道你想要哪一個。結果是,它沒有選擇,而是......或者,MSBuild最終將其設置爲無。

我建議設置默認ItemDefinition,像這樣(的MSBuild 3.5)

<ItemDefinitionGroup> 
    <Layout> 
    <PartnerCode>%(Identity)</PartnerCode> 
    <Suffix>%(PartnerCode)</Suffix> 
    <Destination Condition="'$(LayoutENV)'=='Preprod'">..\Compile\layout\pre\</Destination> 
    </Layout> 
</ItemDefinitionGroup> 

,然後定義他們爲你會有。

<ItemGroup> 
    <Layout Include="Bla" /> 
    <Layout Include="Bli" /> 
    <Layout Include="Bloop"> 
     <PartnerCode>B2</PartnerCode> 
     <Suffix>%(PartnerCode)</Suffix> 
    </Layout> 
</ItemGroup> 

圖片的標題說明


注意。元數據似乎只對每個定義組/項目組進行一次解析,因此如果您要設置PartnerCode,則還必須重置後綴,如第二個示例所示。 我不熟悉MSBuild 3.5中的行爲,但MSBuild 4.0中就是這種情況。

備註。我假設你想要你的文件名作爲後綴,Identity有竅門,請參閱這裏「MSBuild知名項目元數據」:(https://msdn.microsoft.com/en-us/library/ms164313.aspx),如果不是這種情況,你可以隨時遵循自定義覆蓋示例或寫基於它的你自己的功能。在這裏閱讀更多有關「MSBuild屬性功能」的內容:(https://msdn.microsoft.com/en-us/library/dd633440.aspx