MSBuild&;TeamBuild-BuildInParallel由于MSB3021文件权限冲突而失败
我维护一个相当大的软件构建,由大约350个csharp项目组成。我们的调试构建时间大约为17分钟 我一直在寻找提高构建时间的方法,BuildInParallel属性看起来确实很有趣。特别是因为我们有一个四核服务器在进行构建,所以它应该能够真正利用计算能力 但是,唉。。。在设置属性、修改构建代理的配置文件并重新启动它之后,第一次运行看起来确实很有希望,比正常运行快得多,直到它失败为止 查看构建日志后,当构建尝试将标记为CopyLocal=true的引用复制到ouput dir时,它似乎失败了。 如果C#project A和C#project B是并行构建的,并且两者都引用相同的第三方dll,并试图同时复制它,那么尝试复制文件的第二个进程将获得文件访问冲突-该文件正被另一个进程使用 有没有人经历过这种情况,并且能够在团队构建中使用多进程构建MSBuild&;TeamBuild-BuildInParallel由于MSB3021文件权限冲突而失败,msbuild,tfsbuild,Msbuild,Tfsbuild,我维护一个相当大的软件构建,由大约350个csharp项目组成。我们的调试构建时间大约为17分钟 我一直在寻找提高构建时间的方法,BuildInParallel属性看起来确实很有趣。特别是因为我们有一个四核服务器在进行构建,所以它应该能够真正利用计算能力 但是,唉。。。在设置属性、修改构建代理的配置文件并重新启动它之后,第一次运行看起来确实很有希望,比正常运行快得多,直到它失败为止 查看构建日志后,当构建尝试将标记为CopyLocal=true的引用复制到ouput dir时,它似乎失败了。 如
这里有一个失败的例子,有点难以确定哪个项目同时在建 我已删除所有不相关的内容: 54>目标文件中的“\u CopyFilesMarkedCopyLocal” “c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets” 从项目 “d:\temp\PCM\1.3-Maint\u 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\u CI\Binaries\Debug\Oracle.DataAccess.dll”。 命令: 复制/y“……\Bin\3rdParty\Oracle\Oracle.DataAccess.dll” “d:\temp\PCM\1.3-Maint\u 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\u CI\Binaries\Debug\Oracle.DataAccess.dll”。这个 进程无法访问该文件 'd:\temp\PCM\1.3-Maint\u CI\Binaries\Debug\Oracle.DataAccess.dll' 因为它正被另一个进程使用。 已完成执行任务“复制”--失败。54>已完成在项目中构建目标“\u CopyFilesMarkedCopyLocal” “TestDIPS.Core.Data.Server.NUnit.csproj”--失败
您使用的是哪种编译器?据我所知,在VS2005之前,并行构建不适用于多个项目。这是一个众所周知的问题,微软一直说他们最终会解决,但我不知道他们是否真的在VS2008中解决了这个问题。看起来您的项目配置到了相同的输出目录。如果将项目A和项目B配置为输出到不同的目录,这将解决此错误。MSBuild附带的默认目标是为CopyLocal行为而设计的,这是VS所依赖的。当输出到单个输出目录时,CopyLocal会出现问题 为了能够真正并行构建,您需要在Microsoft.*.Common.*.targets文件中禁用几个特定于CopyLocal的行为。我过去曾与MSBuild团队中的一些人交谈过,这是一件非常棘手的事情。即使您删除了一些CopyLocal行为,VS测试访问器在并行构建时也不会表现良好 您可以从以下几点开始:
几个月前我也有同样的问题 VS C#项目文件(.csproj文件)中有两种类型的文件副本:
好运由于文件为只读,也可能发生这种情况。在这些情况下(也就是说,不是大部分其他答案所涵盖的情况),。MS Build Copy task具有未记录的功能,至少谷歌保持沉默。 如果设置了系统范围的环境变量MSBUILDALWAYSRETRY=1 此任务将重试复制文件,即使在复制操作期间出现访问被拒绝异常 输出示例
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3513): Got System.UnauthorizedAccessException: Access to the path 'C:\Builds\8\28\Binaries\Release\fr\System.Spatial.resources.dll' is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost)
at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)
at Microsoft.Build.Tasks.Copy.CopyFileWithLogging(FileState sourceFileState, FileState destinationFileState)
at Microsoft.Build.Tasks.Copy.DoCopyWithRetries(FileState sourceFileState, FileState destinationFileState, CopyFileWithState copyFile) copying C:\Builds\8\28\Sources\Main\Solutions\packages\System.Spatial.5.2.0\lib
et40\fr\System.Spatial.resources.dll to C:\Builds\8\28\Binaries\Release\fr\System.Spatial.resources.dll and HR is -2147024891
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3513): Retrying on ERROR_ACCESS_DENIED because MSBUILDALWAYSRETRY = 1
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3513): Could not copy "C:\Builds\8\28\Sources\Main\Solutions\packages\System.Spatial.5.2.0\lib
et40\fr\System.Spatial.resources.dll" to "C:\Builds\8\28\Binaries\Release\fr\System.Spatial.resources.dll". Beginning retry 1 in 1000ms. Access to the path 'C:\Builds\8\28\Binaries\Release\fr\System.Spatial.resources.dll' is denied.
我们完全支持TFS2008,包括客户端和buildserverYes,但这是TeamBuild的默认行为,如果没有其他解决方法,我不想更改它。很抱歉响应太晚,但非常感谢您的支持