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

gre*_*mac 91 msbuild teamcity

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

几乎每次都会发生.

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

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

以前有人碰过这个吗?

Bri*_*ian 118

使用msbuild/nr:false.

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

也可以看看:

  • 如何让Visual Studio使用该msbuild选项构建项目? (23认同)
  • 有道理:如果我删除/ m似乎不会发生.我正在尝试使用`/ m/nr:false`,我将运行一些构建并查看它是如何进行的.谢谢 (2认同)
  • 过早优化确实是万恶之源.你很糟糕,微软. (2认同)

dan*_*dan 40

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

MSBUILDDISABLENODEREUSE=1
Run Code Online (Sandbox Code Playgroud)