2010-10-12 61 views
76

我使用TeamCity,然後調用msbuild(.NET 4)。我有一個奇怪的問題,那就是在構建完成之後(並且它看起來並不重要,如果它是一個成功構建或沒有關係),msbuild.exe保持打開狀態並鎖定其中一個文件,這意味着每次TeamCity嘗試要清除其工作目錄,它會失敗,並且無法繼續。msbuild.exe保持打開狀態,鎖定文件

這種情況每次都會發生差不多

我真的迷失了這個,所以我會盡量提供儘可能多的細節。

  • 服務器是英特爾酷睿i7,2 GB RAM,帶有Windows Server 2008標準64位SP2。
  • 在TeamCity的,所述轉輪的msbuild配置了/m命令行參數(這意味着使用多個核)
  • 問題中的文件是ALWAYS其是在.NET之一引用相同的外部DLL項目,路徑爲External Tools\Telerik\Telerik.Reporting.Dll。 (其他幾個.DLL文件包含在External Tools目錄中,它們的路徑結構類似,從不會導致此問題)。目前這是Telerik報告的試用版,以防有什麼區別。
  • 當問題發生時,任務管理器中總會列出幾個msbuild.exe *32進程:我相信有7個。使用Process Explorer,它們看起來都像頂級進程(沒有父母)。他們都使用20-50MB的RAM和0.0%的CPU。
  • 如果我等待1-3分鐘,msbuild.exe進程將自行退出,然後TeamCity可以正確更新工作目錄。
  • 如果我手動終止msbuild進程,TeamCity的更新將立即再次運行。
  • 索引服務在Windows中被關閉(雖然之前的兩點幾乎證實它是msbuild.exe導致的問題)。
  • Telerik.reporting.dll沒有特殊屬性。唯一的SVN屬性是svn:mime-type = application/octet-stream

有沒有人跑過這個呢?

回答

104

使用msbuild/nr:false

簡而言之:MSBuild試圖做很多事情要快,特別是在平行構建中。它會產生大量的「節點」 - 可以編譯項目的單個msbuild.exe進程,並且由於進程需要一點時間才能啓動,構建完成後,這些進程會四處停留(默認情況下爲15分鐘,我認爲),所以如果您碰巧再次構建,這些節點可以「重用」並節省過程設置成本。但是,您可以通過使用上述命令行選項關閉nodeReuse來禁用該行爲。

參見:

+2

是有道理的:它似乎沒有如果我刪除/平方米的情況發生。我現在試着用'/ m/nr:false',我會跑幾個版本,看看它是怎麼回事。謝謝 – gregmac 2010-10-13 00:26:28

+0

過了幾天,幾十個版本,以後再也沒有發生過 - 看起來好像已經解決了。謝謝 – gregmac 2010-10-15 18:14:45

+1

太棒了!樂意效勞。 – Brian 2010-10-15 18:22:16

35

到Visual Studio中禁用節點重用,必須使用環境變量:

MSBUILDDISABLENODEREUSE=1 
+0

我有效地使用了它,但是現在有另一個工具在編譯C++時使用VS11 Beta,那就是mt.exe,是否有任何其他變量用於那? – 2012-05-28 16:50:11

+0

不能用VS中的某個對話框設置它嗎? – 2012-11-29 13:50:19

+1

@dan真誠感謝您找到這一個,我*祈禱*還有一個環境變量來禁用Microsoft.VisualStudio.Web.Host.exe。 – jerhewet 2015-04-23 10:36:41

相關問題