我维护着一个相当大的软件的构建,其中包含大约 350 个 csharp 项目。我们的调试构建时间约为 17 分钟。
我一直在寻找缩短构建时间的方法,BuildInParallel 属性确实看起来很有趣。特别是因为我们有一个四核服务器来进行构建,它应该真正能够利用计算能力。
但可惜...在设置属性、修改构建代理的配置文件并重新启动它之后,第一次运行确实看起来很有希望,比正常情况快得多,直到失败为止。
查看构建日志后,当尝试将标记为 CopyLocal=true 的引用复制到输出目录时,构建似乎失败了。
如果 C# 项目 A 和 C# 项目 B 并行构建,并且两者引用相同的第三方 dll,并尝试同时复制它,则尝试复制文件的第二个进程将遇到文件访问冲突 -该文件正在被另一个进程使用。
有人经历过这种情况,并且能够在 Team Build 上运行多进程构建吗?
这是失败的例子之一,很难弄清楚同时正在建设哪个其他项目。
我已经删除了所有不相关的内容:
54>目标文件中的“_CopyFilesMarkedCopyLocal”
“c:\ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ Microsoft.Common.targets”
来自项目
“d:\ temp \ PCM \ 1.3-Maint_CI \ Sources \ Modules \ Core \ Test \ UnitTest \ TestDIPS.Core.Data.Server.NUnit \ TestDIPS.Core.Data.Server.NUnit.csproj”:
54>任务“复制”
将文件从“........................\Bin\3rdParty\Oracle\Oracle.DataAccess.dll”复制到
“d:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll”。
命令:
复制/y“............\Bin\3rdParty\Oracle\Oracle.DataAccess.dll”
“d:\ temp \ PCM \ 1.3-Maint_CI \ Binaries \ Debug \ Oracle.DataAccess.dll”
54>c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(2703,9):
错误 MSB3021:无法复制文件
“.......\Bin\3rdParty\Oracle\Oracle.DataAccess.dll”到
“d:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll”。这
进程无法访问该文件
'd:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll'
因为它正在被另一个进程使用。
完成执行任务“复制”——失败。 54>在项目中完成构建目标“_CopyFilesMarkedCopyLocal”
“TestDIPS.Core.Data.Server.NUnit.csproj”——失败。
MSBuild 附带的默认目标是为 CopyLocal 行为而设计的 - 这是 VS 所依赖的。当您输出到单个输出目录时,CopyLocal 会出现问题。
为了能够真正并行构建,您需要禁用 Microsoft.*.Common.*.targets 文件中的多个 CopyLocal 特定行为。我过去曾与 MSBuild 团队中的一些人交谈过,这是一件特别棘手的事情。即使您取消了某些 CopyLocal 行为,VS 测试访问器在并行构建方面也表现不佳。
您可以从以下一些事情开始:
- 通过将 private 设置为 true 来禁用引用的 CopyLocal 行为。
- 构建依赖项目时,禁用 CopyToOutputPath 文件的 CopyLocal。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)