保持打开,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