2009-09-10 60 views
1

我一直在嘗試使我的TFS中的任務構建更通用,我試圖做的事情之一是將一些文件複製到不同的目錄,具體取決於使用任務的構建。我玩弄了使用屬性的想法,但我想不出乾乾淨淨的方法,所以我試着去使用物品元數據,因爲我已經可以在同一個目標文件的另一個位置執行此操作我正在努力,只有這一次,我想使用屬性。使用屬性設置項目元數據

這就是我想做的事:

<ItemGroup> 
    <DestinationParent Include="$(DeploymentPath)"> 
    <DestinationParentPath>$(DeploymentPath)</QuartzParentPath> 
    </DestinationParent> 
</ItemGroup> 

,後來在建,我試着將一些文件複製到目標文件夾中引用項元數據:

<Copy SourceFiles="@(FilesToCopy)" DestinationFiles="@(FilesToCopy-&gt;'%(DestinationParentPath)\Destination\%(RecursiveDir)%(Filename)%(Extension)')" ContinueOnError="false" ></Copy> 

不幸的是,後生成運行,我的BuildLog顯示如下:

Copying file from "$(BinariesRoot)\%(ConfigurationToBuild.FlavorToBuild)\<File being copied>" to "\Destination\<File being copied>". 

%(DestinationParentPath)had無論出於何種原因,擴展爲空字符串。使用%(DestinationParent.DestinationParentPath)產生了一個錯誤,告訴我,我應該簡單地使用%(DestinationParentPath)。 $(DeploymentPath)在構建中的其他幾個位置展開爲正確的字符串。

混亂的另一個來源是,使用%(ConfigurationToBuild.FlavorToBuild)得到正確的值,即測試,如在下面可以看出:

編輯:這是根節點項目在限定的,而具有DestinationParentPath的ItemGroup在Target節點下定義。這是否也有所作爲?

<ItemGroup> 
    <ConfigurationToBuild Include="Test|Any CPU"> 
    <FlavorToBuild>Test</FlavorToBuild> 
    <PlatformToBuild>Any CPU</PlatformToBuild> 
    </ConfigurationToBuild> 
</ItemGroup> 

它似乎並不彷彿包含屬性是相關的,當你因爲我敢肯定是隻在項目的元數據字符串中的興趣「測試|任何CPU」不引用任何實際的文件。

因此,再次,爲什麼%(DestinationParentPath)擴展爲空字符串?

編輯:我忘了提及,我也嘗試硬編碼DestinationParentPath的實際路徑,但這仍導致%(DestinationParentPath)擴展爲空字符串。

回答

1

編輯:這是在根節點Project下定義的,而具有DestinationParentPath的ItemGroup在目標節點下定義。這是否也有所作爲?

是的,它有所不同。在Tar​​get中定義ItemGroup的功能是msbuild 3.5的新功能。儘管看起來是聲明式的,但它實際上是在運行時執行的,就像您調用舊樣式CreateItem/CreateProperty任務一樣。僅此一點就會導致潛在的問題:您需要考慮何時(首先)調用包含的任務。 Order of operations is not always obvious to the naked eye。使用%(DestinationParentPath)依賴創建任務的任務可能是明智的,即使沒有「邏輯」依賴關係也是如此。

此外,還有古老的msbuild範圍怪癖/錯誤。 Dynamically created properties & items are not visible to "sibling" tasks。另外,items updated in nested builds aren't always bubbled up

查看鏈接中的解決方法,即使它是icky,您也應該能夠找到適合您的東西。

+0

感謝您的答案和鏈接......想出瞭如何解決我的問題:)(是的,它有點噁心,但它仍然工作得很好) 但仍然讓我感到困惑的一個問題是:似乎上面提到的%(Configuration.FlavorToBuild)被視爲全球...項目?這就是爲什麼我能夠在該領域的其他部分使用它嗎? – 2009-09-11 16:34:34

+1

配置項由Team Build在流程的早期階段進行設置,所以我並不感到驚訝,它可以在您的腳本不起作用的情況下工作。 /////也許「範圍」是使用的錯誤詞。屬性和項目在msbuild中總是「全局的」,因爲$(foo)總是指的是「相同的」$(foo),無論它出現在哪裏。 C#比喻:假設沒有命名空間關鍵字,只有1個類定義。作爲一項規則,我們總是通過引用這個類的單個實例。第一個鏈接描述流量控制。後兩者描述了一個陳舊副本傳入/傳出的怪癖。 – 2009-09-11 17:17:00

相關問題