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 保持打开状态,锁定文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在批处理文件中调用设置为“C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe”的变量?
拆分 MS Access 数据库需要很长时间才能打开 - 后端不断锁定和解锁
cmake cmake MSBUILD : error MSB1009: 项目文件不存在 or MSBuild.exe not find !