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

时间:2010-10-12 23:51:29

标签: msbuild teamcity

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

每次发生几乎

我真的迷失了这个,所以我会尽量提供尽可能详细的信息。

  • 服务器是英特尔酷睿i7,2 GB内存,带有Windows Server 2008标准64位SP2。
  • 在TeamCity中,msbuild运行器配置了/m命令行参数(这意味着使用多个核心)
  • 相关文件始终与其中一个.NET项目中引用的路径External Tools\Telerik\Telerik.Reporting.Dll中的外部DLL相同。 (External Tools目录中还包含其他几个.DLL文件,这些文件在类似的路径结构中永远不会导致此问题。目前,这是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

以前有没有人碰过这个?

2 个答案:

答案 0 :(得分:116)

msbuild/nr:false一起使用。

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

另见:

答案 1 :(得分:39)

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

MSBUILDDISABLENODEREUSE=1