2011-11-25 22 views
3

使用TFS Build 2010,我已經爲幾個項目構建了運行devenv.com的進程。之後,我希望所有的二進制文件都可以使用C#自定義構建活動與「File.Copy」從輸出文件夾中複製。但是,把我這個異常與文件的第一個副本:TFSBuild 2010:File.Copy c#snippets在編譯後拋出異常

The process cannot access the file 'C:\Test\BuildServer\Sources\Library\LibraryInstall\LibraryInstall\Release\LibraryInstall.msm' because it is being used by another process. 

看來該文件仍然被使用由devenv.com。任何想法如何?除了File.Copy,有沒有更好的方法來複制它,無論文件狀態如何?

======

我發現了一個醜陋的方式:

Process proc = new Process(); 
proc.StartInfo.UseShellExecute = true; 
proc.StartInfo.FileName = @"C:\WINDOWS\system32\xcopy.exe"; 
proc.StartInfo.Arguments = "/Y " + Path.Combine(sourcesDirectory, fileName) + " " + binariesDirectory; 
proc.Start(); 
+1

在的buildin複製任務有一個重試和retrydelay設置。雖然它掩蓋了真正的問題,但它可能是一個醜陋的快速解決方案。 http://msdn.microsoft.com/en-us/library/3e54c37h.aspx – rene

+1

它聽起來像你沒有正確設置依賴和/或運行並行構建。 – leppie

+0

不,它是序列... – lannyboy

回答

0

devenv的是一個侵略性的文件櫃。如果你可以通過創建一個MSBuild文件並繞過devenv來構建你的項目,那麼你會變得更好。儘管一些項目類型只能用devenv構建,但您尚未指定您正在使用的項目類型,因此這可能不是一個選項。

MSBuild有一個名爲「節點重用」的功能,它可以創建最多15分鐘的進程,作爲後續構建的優化。這可能是節點重用與devenv的文件鎖定行爲相結合給你帶來麻煩。

你還沒有清楚地知道你是如何執行你的構建,但是如果涉及到MSBuild,你可以嘗試指定/ nodereuse:false選項來禁用這個功能。

我也看到了流氓MSBuild和devenv進程掛在文件上,他們可以掛起來,直到你殺死他們,如果你的構建中有模糊的例外。

0

我有幾個業餘的東西。不要把負上我的回答=)

首先,來看看this answer改變你的算法有點

  • 您可以創建批處理文件,其中包括相同的醜陋方法 它。然後調用從C#這個批處理文件
  • 也許你可以使用FileStream ..二進制讀寫
  • 也許你可以導入VB全球化志願服務青年到您的項目和使用(無感 )
  • 或者直接殺滅過程,贊同這個錯誤。

這裏是另一個搜索,請看看this question

這是最後一個也是最難的核心long shot

問候......