我维护了一个相当大的软件的构建,包括大约 350 个 csharp 项目。我们的调试构建时间约为 17 分钟。
我一直在寻找缩短构建时间的方法,并且 BuildInParallel 属性确实很吸引人。尤其是因为我们有一个四核服务器来做我们的构建,它应该真的能够利用计算能力。
但是,唉...在设置属性,修改构建代理的配置文件并重新启动它之后,第一次运行确实看起来很有希望,比正常情况快得多,直到它失败为止。
查看构建日志后,当尝试将标记为 CopyLocal=true 的引用复制到输出目录时,构建似乎失败了。
如果 C# 项目 A 和 C# 项目 B 并行构建,并且两者都引用相同的第三方 dll,并尝试同时复制它,则尝试复制文件的第二个进程将获得文件访问冲突 -该文件正被另一个进程使用。
任何人都经历过这种情况,并且能够在 Team Build 上进行多进程构建?
这是其中一个失败,有点难以弄清楚同时正在 build 的其他项目。
我已经删除了所有不相关的东西:
54>Target "_CopyFilesMarkedCopyLocal" in file "c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets" from project "d:\temp\PCM\1.3-Maint_CI\Sources\Modules\Core\Test\UnitTest\TestDIPS.Core.Data.Server.NUnit\TestDIPS.Core.Data.Server.NUnit.csproj": 54>Task "Copy" Copying file from "..........\Bin\3rdParty\Oracle\Oracle.DataAccess.dll" to "d:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll". Command: copy /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): error MSB3021: Unable to copy file "..........\Bin\3rdParty\Oracle\Oracle.DataAccess.dll" to "d:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll". The process cannot access the file 'd:\temp\PCM\1.3-Maint_CI\Binaries\Debug\Oracle.DataAccess.dll' because it is being used by another process. Done executing task "Copy" -- FAILED. 54>Done building target "_CopyFilesMarkedCopyLocal" in project "TestDIPS.Core.Data.Server.NUnit.csproj" -- FAILED.
请您参考如下方法:
MSBuild 附带的默认目标是为 CopyLocal 行为而设计的——这是 VS 所依赖的。当您输出到单个输出目录时, CopyLocal 会出现问题。
为了能够真正并行构建,您需要在 Microsoft.*.Common.*.targets 文件中禁用多个 CopyLocal 特定行为。我过去曾与 MSBuild 团队的一些人交谈过,这是一件特别麻烦的事情。即使您清除了某些 CopyLocal 行为,VS 测试访问器在并行构建时也表现不佳。
您可以从以下几点开始: