2012-09-20 64 views
1

我想找出一種方法來訪問來自上下文的項目,而不必明確聲明ItemGroup。在上下文中的參考項目

目前正在爲複製任務:「?」

<Copy SourceFiles="C:\blabla\**\*.*" DestinationFiles="%(?.RecursiveDir)" /> 

我可以代替使用什麼選擇上下文中的項目?

原因是,我有一個MSBuild項目文件是通過XSLT生成的,並且存在未知數量的文件夾&文件(它們中的一些遵循目標文件夾下的不同結構 - 在這種情況下,我打算使用不同的meta數據代替RecursiveDir)在輸入XML中。是否有可能在不需要聲明大量Itemgroups(或具有大量Items的Itemgroup)的情況下實現此目的?

我試過尋找這個,但是我發現的都是聲明Itemgroups的帖子。

+0

您想要引用項目元數據,而不明確地刪除項目本身,所以我懷疑你將能夠做到這一點。 複製任務要求SourceFiles應該是ITaskItem []類型(文學 - 它需要項目集合)。 其實MSDN描述複製任務(http://msdn.microsoft.com/en-us/library/3e54c37h.aspx)有你可以遵循的確切例子,但你應該在裏面聲明itemgroup與嵌套items子句。 –

+0

謝謝阿列克謝。但是明確的聲明正是我想要避免的。如果我錯了,請更正我的錯誤,但我的觀察是,具有大量文件(巨大文件集)的項目會使MSBuild變慢,而文件數量較少的文件集。 –

+1

它取決於=)。在巨大的文件集=下,你指的是什麼數字)。毫無疑問,msbuild引擎會發出並評估內存中的每個項目組,並且可能是巨大的文件集可能導致更大的內存佔用。但msbuild不適合作爲您選擇的腳本語言工作(即使powershell在一個目錄中有250K +文件,Windows本身也有問題)。如果您只是需要執行副本而不訪問完整元(遞歸目錄除外) - 使用Exec任務並調用robocopy.exe - 它比其他任何工具都更好(考慮可用的開箱即用工具)。 –

回答

0

@Alexey謝爾巴克寫道:

要引用項目的元數據沒有明確聲明項目本身,所以我懷疑,你將能夠做到這一點。此外,複製任務要求源文件應該是ITaskItem[]類型(從字面上看 - 它需要項目收集)。其實msdn description of copy task有一個你可以遵循的確切例子,但是你應該在裏面聲明帶有嵌套items子句的itemgroup。

你可能想知道你是否有一個包含很多文件的項目,它是否會讓MSBuild變慢。 答案是:它取決於=)。在巨大的文件集=下,你指的是什麼數字)。確實,MSBuild引擎發出並評估內存中的每個項目組,並且可能是一個巨大的文件集可能導致更大的內存佔用。但MSBuild不適合作爲您選擇的腳本語言工作(即使PowerShell在一個目錄中有250K +文件也存在問題,Windows本身也是如此)。如果您只是需要執行副本而不訪問完整元(遞歸目錄除外) - 使用Exec任務並調用robocopy.exe - 它比其他任何工具都更好(考慮可用的開箱即用工具)。

作爲一個補充 - 在我們宣佈具體工具不可接受之前,應對大量數據進行測試和評估。我認爲,只要MSBuild能夠處理大型解決方案 - 它可能會處理相當大的文件集。它只是資源/速度問題。但任何工具也有它不可逾越的限制。

其實我的意思不是robocopy擴展,但robocopy.exe本身en.wikipedia.org/wiki/Robocopy,你可以很容易地用Exec任務來調用它。在「複製」速度方面肯定hardlinks是無法匹敵的)。但請記住 - 它只能在單個磁盤捲上工作(因爲它不是實際的副本,它只是將另一個文件名添加到同一組字節=))。如果您需要實際複製到另一個驅動器或通過網絡 - robocopy將再次發光=)。

PS:20k文件距離我的定義很遠;)我們處理了〜280k-300k的小文件,總計80Gb左右的卷。 Powershell的管道和robocopy實際位移動贏得了這一輪。

+0

([在評論中回答,並轉發給社區wiki](http://meta.stackoverflow.com/questions/251597/question-with-no-answers-but-issue-solved-in-the-comments)。 ) –