我使用 TeamCity,它又调用 msbuild (.NET 4)。我有一个奇怪的问题,在构建完成后(构建是否成功似乎并不重要),msbuild.exe 保持打开状态,并锁定其中一个文件,这意味着每次 TeamCity 尝试清除其工作目录,它会失败,并且无法继续。
有时候是这样的almost每次。
我对这个问题真的很迷茫,所以我会尽力提供尽可能多的细节。
- 服务器是 Intel Core i7、2 GB RAM,采用 Windows Server 2008 标准 64 位 SP2。
- 在 TeamCity 中,msbuild 运行程序配置为
/m
命令行参数(表示使用多核)
- 有问题的文件是ALWAYS.NET 项目之一中引用的同一外部 DLL,位于路径中
External Tools\Telerik\Telerik.Reporting.Dll
。 (还有其他几个 .DLL 文件包含在External Tools
类似的路径结构中的 dir 永远不会导致此问题)。目前这是 Telerik 报告的试用版,以防有任何影响。
- 当问题发生时,总会有几个
msbuild.exe *32
任务管理器中列出的进程:我相信有 7 个。使用 Process Explorer,它们看起来都像顶级进程(没有父进程)。它们都使用 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
以前有人遇到过这个吗?
Use msbuild
with /nr:false
.
简而言之:MSBuild 试图快速完成很多事情,尤其是并行构建。它将产生大量“节点” - 可以编译项目的单独的 msbuild.exe 进程,并且由于进程需要一点时间来启动,因此在构建完成后,这些进程会挂起(默认情况下,我认为是 15 分钟) ),这样如果你碰巧很快再次构建,这些节点可以被“重用”并节省流程设置成本。但是您可以通过使用上述命令行选项关闭 nodeReuse 来禁用该行为。
也可以看看:
-
并行构建后,MSBuild 和 ConHost 保留在内存中 http://connect.microsoft.com/VisualStudio/feedback/details/554791/msbuild-and-conhost-remain-in-memory-after-parallel-build
-
MSBuild 命令行参考 http://msdn.microsoft.com/en-us/library/ms164311.aspx
-
不锁定自定义 MSBuild 任务 DLL 的并行构建 http://devnet.jetbrains.com/thread/286796
-
MultiProc MSBuild 中的节点重用 https://learn.microsoft.com/en-us/archive/blogs/msbuild/node-reuse-in-multiproc-msbuild
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)