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

Posted

技术标签:

【中文标题】msbuild.exe 保持打开状态,锁定文件【英文标题】:msbuild.exe staying open, locking files 【发布时间】:2011-04-24 14:37:37 【问题描述】:

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

这种情况几乎每次都会发生。

我真的迷路了,所以我会尽量提供尽可能多的细节。

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

以前有人遇到过这个吗?

【问题讨论】:

【参考方案1】:

msbuild/nr:false 一起使用。

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

另见:

MSBuild and ConHost remain in memory after parallel build

MSBuild Command-Line Reference

Parallel builds that don't lock custom MSBuild task DLLs

Node Reuse in MultiProc MSBuild

【讨论】:

有道理:如果我删除 /m,它似乎不会发生。我现在正在尝试使用/m /nr:false,我将运行几个版本,看看效果如何。谢谢 已经几天了,后来构建了几十个,但它没有再次发生 - 看起来它已经解决了。谢谢 如何让 Visual Studio 使用该 msbuild 选项构建项目? 我仍然想知道,但实际上我遇到了 C++/CLI 项目的 Visual Studio 11 Beta 错误。是否会导致相同的症状:connect.microsoft.com/VisualStudio/feedback/details/728912/… @CameronTaggart 您可以使用项目/解决方案文件夹中托管的特殊文件添加 msbuild 命令行选项。见docs.microsoft.com/en-us/visualstudio/msbuild/…【参考方案2】:

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

MSBUILDDISABLENODEREUSE=1

【讨论】:

我有效地使用了这个,但是现在有另一个工具失败了,当使用 VS11 Beta 编译 C++ 时,即 mt.exe,还有其他变量可以使用吗? 不能用VS中某处的对话框设置吗? @dan 衷心感谢您找到这个,我祈祷还有一个环境变量可以禁用 Microsoft.VisualStudio.Web.Host.exe。 这也适用于从命令行运行构建,例如批处理脚本、构建服务器等。

以上是关于msbuild.exe 保持打开状态,锁定文件的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 是不是使对象保持打开状态?

站点关闭时防止打开文件锁定

使用包打开 XPS 文件会保持文件锁定

如何在批处理文件中调用设置为“C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe”的变量?

拆分 MS Access 数据库需要很长时间才能打开 - 后端不断锁定和解锁

cmake cmake MSBUILD : error MSB1009: 项目文件不存在 or MSBuild.exe not find !