msbuild.exe保持打开状态,锁定文件


97

我使用TeamCity,后者依次调用msbuild(.NET 4)。我有一个奇怪的问题,就是在构建完成之后(构建是否成功并不重要),msbuild.exe保持打开状态并锁定其中一个文件,这意味着TeamCity每次尝试清除其工作目录,它将失败,并且无法继续。

几乎每次都会发生。

我真的迷失了这一点,因此我将尝试提供尽可能多的细节。

  • 服务器是2 GB RAM的Intel Core i7,具有Windows Server 2008标准64位SP2。
  • 在TeamCity中,msbuild运行器配置有/m命令行参数(表示使用多个内核)
  • 有问题的文件始终是path中.NET项目之一中引用的相同外部DLL External Tools\Telerik\Telerik.Reporting.Dll。(在External Tools目录中包含其他几个.DLL文件,它们的路径结构相似,它们从未引起此问题)。当前,这是Telerik报告的试用版,以防万一。
  • 发生问题时,msbuild.exe *32任务管理器中始终列出几个进程:我相信有7个进程。使用进程资源管理器,它们看起来都像顶级进程(没有父级)。它们都使用20-50MB的内存和0.0%的CPU。
  • 如果我等待1-3分钟,msbuild.exe进程将自行退出,然后TeamCity可以正确更新工作目录。
  • 如果我手动终止msbuild进程,TeamCity的更新将立即再次起作用。
  • Windows中的索引服务已关闭(尽管前两点几乎可以肯定是msbuild.exe引起了问题)。
  • Telerik.reporting.dll没有特殊属性。唯一的SVN属性是svn:mime-type = application/octet-stream

有人遇到过吗?

Answers:


122

msbuild与一起使用/nr:false

简要地说:MSBuild试图做很多事情以提高速度,特别是对于并行构建。它将产生许多“节点”-可以编译项目的单个msbuild.exe进程,由于进程花了一些时间启动,因此在构建完成后,这些进程会闲逛(默认情况下,持续15分钟,我认为),这样,如果您碰巧很快要再次构建,则可以“重用”这些节点并节省流程设置成本。但是您可以通过使用上述命令行选项关闭nodeReuse来禁用该行为。

也可以看看:


2
很有道理:如果我删除/ m,似乎没有发生。我现在尝试使用/m /nr:false,我将运行一些构建并查看其运行方式。谢谢
gregmac

26
如何使用该msbuild选项使Visual Studio生成项目?
卡梅隆·塔加特

1
我仍然想知道,但是实际上我遇到了C ++ / CLI项目的Visual Studio 11 Beta错误。是引起相同的症状:connect.microsoft.com/VisualStudio/feedback/details/728912/…–
Cameron Taggart

3
过早的优化确实是万恶之源。你真烂,微软。
johnwbyrd

1
@CameronTaggart您可以使用在项目/解决方案文件夹中托管的特殊文件添加msbuild命令行选项。见docs.microsoft.com/en-us/visualstudio/msbuild/...
needfulthing

43

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

MSBUILDDISABLENODEREUSE=1

我有效地使用了它,但是现在还有另一个工具失败了,当使用VS11 Beta编译C ++时,即mt.exe,是否还有其他变量可以使用?
EugenioMiró2012年

不能使用VS中某个地方的对话框进行设置吗?
dom_beau

1
@dan真诚的感谢您找到了这个,我祈祷有一个环境变量也可以禁用Microsoft.VisualStudio.Web.Host.exe。
jerhewet 2015年

在命令行运行构建时,例如一个批处理脚本,构建服务器,等等。这也适用
戴夫·ê
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.