保持打开,locking文件msbuild.exe

我使用TeamCity,然后调用msbuild(.NET 4)。 我有一个奇怪的问题,那就是在构build完成之后(它看起来好像不是一个成功的构build),msbuild.exe保持打开状态,并locking其中一个文件,这意味着每当TeamCity尝试清除其工作目录,则失败,无法继续。

几乎每次都发生这种情况。

我真的迷失在这一个,所以我会尽量提供尽可能多的细节。

  • 服务器是英特尔酷睿i7,2 GB RAM,采用Windows Server 2008标准64位SP2。
  • 在TeamCity中,msbuild runnerconfiguration了/m命令行参数(这意味着使用多个核心)
  • 有问题的文件总是External Tools\Telerik\Telerik.Reporting.Dll的path中的.NET项目之一引用相同的外部DLL。 (在External Tools目录中包含几个其他.DLL文件在一个类似的path结构,永远不会造成这个问题)。 目前这是与Telerik报告的试用版,以防有什么不同。
  • 当问题发生时,任务pipe理器中总会有几个msbuild.exe *32进程列出:我相信有7个。使用Process Explorer,它们看起来都像顶级进程(没有父母)。 他们都使用20-50MB的RAM和0.0%的CPU。
  • 如果我等1-3分钟,msbuild.exe进程将自行退出,然后TeamCity可以正确更新工作目录。
  • 如果我手动终止msbuild进程,TeamCity的更新将立即再次工作。
  • 索引服务在Windows中被closures(虽然之前的两点几乎证实了它是msbuild.exe导致的问题)。
  • Telerik.reporting.dll没有特殊的属性。 唯一的SVN属性是svn:mime-type = application/octet-stream

有没有人跑过这个呢?

使用msbuild/nr:false

简而言之:MSBuild试图做很多事情要快,特别是与平行构build。 它会产生大量的“节点” – 单独的msbuild.exe进程,可以编译项目,因为进程需要一点时间旋转起来,构build完成后,这些进程挂起(默认情况下,15分钟,我想),所以如果你碰巧再次构build,这些节点可以被“重用”并节省过程设置成本。 但是,您可以通过使用上述命令行选项closuresnodeReuse来禁用该行为。

也可以看看:

  • 并行构build后,MSBuild和ConHost保留在内存中

  • MSBuild命令行参考

  • 并行构build不locking自定义MSBuild任务DLL

  • 节点在MultiProc MSBuild中重用

要在Visual Studio中禁用节点重用,您必须使用环境variables:

 MSBUILDDISABLENODEREUSE=1