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

msbuild.exe保持打开状态,锁定文件,msbuild,teamcity,Msbuild,Teamcity,我使用TeamCity,它反过来调用msbuild(.net4)。我有一个奇怪的问题,在构建完成后(无论构建是否成功),msbuild.exe保持打开状态,并锁定其中一个文件,这意味着每次TeamCity尝试清除其工作目录时,它都会失败,无法继续 这种情况几乎每次都会发生 我真的很迷恋这一点,所以我会尽量提供更多的细节 服务器是Intel Core i7,2 GB ram,采用Windows Server 2008标准64位SP2 在TeamCity中,msbuild运行程序配置有/m命令行参

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

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

我真的很迷恋这一点,所以我会尽量提供更多的细节

  • 服务器是Intel Core i7,2 GB ram,采用Windows Server 2008标准64位SP2
  • 在TeamCity中,msbuild运行程序配置有
    /m
    命令行参数(这意味着使用多个核心)
  • 所讨论的文件始终是.NET项目中引用的同一个外部DLL,路径为
    external Tools\Telerik\Telerik.Reporting.DLL
    。(在
    External Tools
    dir中包含的其他几个.DLL文件具有类似的路径结构,它们不会导致此问题)。目前这是Telerik reports的试用版,以防有任何不同
  • 当问题发生时,任务管理器中总会列出几个
    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

以前有人见过这个吗

msbuild
/nr:false
一起使用

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

另见:


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

MSBUILDDISABLENODEREUSE=1

有道理:如果我删除/m,它似乎不会发生。我现在正在尝试使用
/m/nr:false
,我将运行一些构建,看看它是如何运行的。谢天谢地,仅仅几天,几十次构建之后,它就再也没有发生过——看起来它已经解决了。ThanksHow您是否让Visual Studio使用该msbuild选项生成项目?我仍然想知道,但实际上我遇到了C++/CLI项目的Visual Studio 11 Beta错误。Is会导致相同的症状:@camerontagart您可以使用项目/解决方案文件夹中托管的特殊文件添加msbuild命令行选项。看到我使用这个有效,但是还有另一个工具,现在失败,当编译与VS11 beta的C++,那就是MT.EXE,有其他的变量来使用它吗?不能用VS中的某个对话框设置吗?@丹真诚地感谢找到这个,我祈祷有一个环境变量可以禁用Microsoft.VisualStudio.Web.Host.exe。这在从命令行运行生成时也有效,例如批处理脚本、生成服务器等。