2010-10-12 153 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