停滞的非活动msbuild.exe进程、锁定的Stylecop.dll、Nuget AccessViolationException和CI构建相互冲突的奥秘
意见:停滞的非活动msbuild.exe进程、锁定的Stylecop.dll、Nuget AccessViolationException和CI构建相互冲突的奥秘,msbuild,nuget,stylecop,Msbuild,Nuget,Stylecop,意见: 在我们的Jenkins build服务器上,我们看到很多msbuild.exe进程(~100)在作业完成后挂起,内存使用量约为20mb,CPU活动率为0% 使用不同版本的stylecop的生成间歇性失败: workspace\packages\StyleCop.MSBuild.4.7.41.0\tools\StyleCop.targets(109,7): 错误MSB4131:“StyleCopTask”任务不支持“ViolationCount”参数。 验证该参数是否存在于任务中,并且它
- 在我们的Jenkins build服务器上,我们看到很多msbuild.exe进程(~100)在作业完成后挂起,内存使用量约为20mb,CPU活动率为0%
- 使用不同版本的stylecop的生成间歇性失败:
workspace\packages\StyleCop.MSBuild.4.7.41.0\tools\StyleCop.targets(109,7): 错误MSB4131:“StyleCopTask”任务不支持“ViolationCount”参数。 验证该参数是否存在于任务中,并且它是可获取的公共实例属性。
- Nuget.exe间歇性退出,出现以下访问冲突错误(0x0000005):
\workspace\.nuget\nuget安装。\workspace\packages.config-o。\workspace\packages” 已退出,代码为-1073741819。
`msbuild /t:%Targets% /m
/p:Client=%Client%;LOCAL_BUILD=%LOCAL_BUILD%;BUILD_NUMBER=%BUILD_NUMBER%;
JOB_NAME=%JOB_NAME%;Env=%Env%;Configuration=%Configuration%;Platform=%Platform%;
Clean=%Clean%; %~dp0\_Jenkins\Build.proj`
在进行了大量的挖掘和尝试之后,我最终创建了一个新的最小解决方案,该解决方案在几乎没有其他问题的情况下重现了该问题。该问题最终由msbuild的多核并行化——“m”参数引起
- “m”参数告诉msbuild生成“节点”,这些节点在生成结束后将保持活动状态,然后被新生成重新使用
- StyleCop“ViolationCount”错误是由给定的生成重新使用另一个生成的工作区中旧版本的StyleCop.dll引起的,该工作区不支持ViolationCount。这很奇怪,因为CI工作区仅包含新版本。StyleCop.dll加载到给定的MsBuild节点后,它似乎仍将保持加载状态我只能假设这是因为StyleCop将某种单例加载到节点进程中?这也解释了构建之间的文件锁定
- nuget访问冲突崩溃现在已经消失(没有其他更改),因此显然与上述节点重用问题有关
- 由于“m”参数默认为内核数,因此我们看到在生成服务器上为给定作业创建了24个msbuild实例
- 将行
添加到启动msbuild的批处理文件中set MSBUILDDISABLENODEREUSE=1
- 使用
/m:4/nr:false启动msbuild
- “nr”参数表告诉msbuild不要使用“节点重用”(Node Reuse)——因此msbuild实例在生成完成后关闭,不再相互冲突——从而导致上述错误
- “m”参数设置为4以停止每个作业生成过多节点
- 我也有同样的问题。我在csproj文件中找到了一个旧的参考资料
<PropertyGroup>
<StyleCopMSBuildTargetsFile>..\packages\StyleCop.MSBuild.4.7.48.0\tools\StyleCop.targets</StyleCopMSBuildTargetsFile>
..\packages\StyleCop.MSBuild.4.7.48.0\tools\StyleCop.targets
此外,我删除了整个“软件包”“关闭visual studio后与sln文件位于同一文件夹中的文件夹。它触发了VS来重建文件夹并释放旧版本stylecop的缓存我有一段时间遇到了同样的问题,在一些挖掘之后,构建需要6分钟才能完成,我发现我们的It节点重用错误,因此添加/m:4/nr:false立即修复我的问题没有任何评论的否决票。谢谢因为这类事情是i)开发工作中最烦人的问题,ii)最不可能用谷歌轻易解决的问题。我得到了这种确切的行为,但继续。不幸的是,禁用节点重用对我不起作用:(我也遇到了这个确切的错误。/m:4/nr:false对我来说非常有效。是否可以在VS2012中设置此msbuild参数?(即。/m和/nr)我面临的情况要简单得多。运行VS,留下许多msbuild进程。env技巧解决了这个问题。设置MSBUILDDISABLENODEREUSE=1并将/nr:false传递给msbuild.exe是否冗余?是否可以执行其中一项操作?