msbuild.exe未关闭,文件被锁定

106
我使用TeamCity,它又调用msbuild(.NET 4)。我遇到了一个奇怪的问题,就是在构建完成后(无论构建是否成功),msbuild.exe仍然保持打开状态,并锁定其中一个文件,这意味着每次TeamCity尝试清除其工作目录时都会失败,无法继续。
这几乎每次都会发生。
我真的对这个问题感到迷惑,因此我会尽可能提供更多详细信息:
- 服务器是Intel Core i7、2 GB RAM,带有Windows Server 2008标准64位SP2。 - 在TeamCity中,msbuild运行程序配置了/m命令行参数(表示使用多个核心) - 问题文件始终是同一个外部DLL文件,在.NET项目中引用,路径为External Tools\Telerik\Telerik.Reporting.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个回答

133

使用 msbuild 命令并添加参数 /nr:false

简言之:MSBuild 会尝试进行大量优化,尤其是在并行构建方面。它会生成许多“节点”——单独的 msbuild.exe 进程,可以编译项目。由于进程需要一定的时间才能启动,因此在构建完成后,这些进程会保持运行状态(默认情况下,保持15分钟),以便如果您很快再次构建,这些节点可以被“重用”,节省进程设置成本。但您可以使用上述命令行选项关闭节点重用的行为。

另请参见:


2
有道理:如果我移除 /m,似乎就不会发生这种情况。我现在正在尝试使用 /m /nr:false,我将运行几个构建并观察其效果。谢谢。 - gregmac
31
如何让Visual Studio使用msbuild选项构建项目? - Cameron Taggart
1
我仍然想知道,但我遇到了一個針對C++/CLI項目的Visual Studio 11 Beta錯誤。 它會導致相同的症狀:http://connect.microsoft.com/VisualStudio/feedback/details/728912/vs11-regression-wdp4-consumer-preview-msbuild-exe-apparently-causes-mt-exe-to-fail-by-holding-a-newly-created-dll-open - Cameron Taggart
上面的顶部链接已经失效了(在登录到Microsoft Connect之后)。 - thecoolmacdude
1
@CameronTaggart 你可以通过在项目/解决方案文件夹中托管特殊文件来添加msbuild命令行选项。请参见https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-response-files?view=vs-2019 - needfulthing
显示剩余2条评论

47

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

MSBUILDDISABLENODEREUSE=1

我之前成功地使用了这个工具,但是现在在使用VS11 Beta编译C++时,另一个工具mt.exe却出现了问题。请问还有其他的变量可以使用吗? - Eugenio Miró
能不能在VS的某个对话框中设置它? - dom_beau
1
@dan 真诚感谢您找到这个问题,我祈祷也有一个环境变量可以禁用 Microsoft.VisualStudio.Web.Host.exe。 - jerhewet
这也适用于从命令行运行构建,例如批处理脚本、构建服务器等。 - Dave E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接