当前位置:  开发笔记 > 编程语言 > 正文

MSBuild和TeamBuild - 由于MSB3021文件权限违规导致BuildInParallel失败

如何解决《MSBuild和TeamBuild-由于MSB3021文件权限违规导致BuildInParallel失败》经验,为你挑选了3个好方法。

我维护了一个相当大的软件的构建,包括大约350个csharp项目.调试内置时钟的构建时间约为17分钟.

我一直在寻找改善构建时间的方法,而BuildInParallel属性确实看起来很吸引人.特别是因为我们有一个四核服务器在做我们的构建,它应该真的能够利用计算能力.

但是唉...在设置属性,修改构建代理的配置文件并重新启动它之后,第一次运行确实看起来很有希望,比正常情况更快,直到它失败的程度.

在查看构建日志之后,当它尝试将标记为CopyLocal = true的引用复制到输出目录时,看起来构建失败.如果C#项目A和C#项目B并行构建,并且两者都引用相同的第三方dll,并尝试同时复制它,则尝试复制文件的第二个进程将获得文件访问冲突 - 该文件正被另一个进程使用.

有没有人经历过这个,并且能够在Team Build上获得多进程构建?


这是其中一个失败,有点难以弄清楚同时建造了哪个其他项目.

我删除了所有不相关的东西:

54>从项目"d:\ temp\PCM\1.3-Maint_CI\Sources\Modules\Core \"文件"c:\ WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets"中定位"_CopyFilesMarkedCopyLocal" 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".命令: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):错误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>在项目"TestDIPS.Core.Data.Server.NUnit.csproj"中完成构建目标"_CopyFilesMarkedCopyLocal" - 失败.

小智.. 15

MSBuild附带的默认目标是为CopyLocal行为设计的 - 这是VS所依赖的行为.当您输出到单个输出目录时,CopyLocal会出现问题.

为了能够真正并行构建,您需要在Microsoft.*.Common.*.targets文件中禁用多个CopyLocal特定行为.我过去曾和MSBuild团队的一些人谈过,这是一个特别毛茸茸的事情.即使你没有删除一些CopyLocal行为,VS测试访问器也不能很好地与并行构建.

你可以从一些事情开始:

    通过将private设置为true来禁用引用的CopyLocal行为.

    在构建依赖项目时,为CopyToOutputPath文件禁用CopyLocal.


Shahyad Shar.. 9

几个月前我遇到了同样的问题.

VS C#项目文件(.csproj文件)中有两种类型的文件复制:

    具有"复制本地"属性的引用程序集.当属性为True时,程序集将复制到输出路径中.

    具有"复制到输出目录"属性的其他文件.当属性设置为"始终复制"或"复制如果更新"时,文件将复制到输出路径中.

问题:

答:如果同时构建了两个或多个项目,并且其中两个尝试将同一文件复制到输出目录中,则可能会遇到错误,如"错误MSB3021:无法复制文件","访问路径被拒绝" ,"进程无法访问文件"等.

B:如果两个或多个项目引用了一个具有类型2的项目的公共项目.在这种情况下,在项目的并行构建期间,其中两个可能会尝试同时构建公共项目的"GetCopyToOutputDirectoryItems"目标.所以你可能再次遇到上述例外情况.

解决方法1:

强制不同.csproj文件的OutputPath不在同一路径中

http://social.msdn.microsoft.com/Forums/is/tfsbuild/thread/a62a6f98-ec44-46c1-a0d0-7f441f0db973

溶液2:

步骤1:解决方案是为项目中的所有常见项目之外的所有项目设置公共项目的属性(在案例1中为False,在案例2中为"不复制").或者删除它们如果可能的话.

为了找到潜在的错误,您可以在文件*.csproj中搜索单词"private"(对于案例1)和"CopyToOutputDirectory"(对于案例2)

第2步: ...

祝好运



1> 小智..:

MSBuild附带的默认目标是为CopyLocal行为设计的 - 这是VS所依赖的行为.当您输出到单个输出目录时,CopyLocal会出现问题.

为了能够真正并行构建,您需要在Microsoft.*.Common.*.targets文件中禁用多个CopyLocal特定行为.我过去曾和MSBuild团队的一些人谈过,这是一个特别毛茸茸的事情.即使你没有删除一些CopyLocal行为,VS测试访问器也不能很好地与并行构建.

你可以从一些事情开始:

    通过将private设置为true来禁用引用的CopyLocal行为.

    在构建依赖项目时,为CopyToOutputPath文件禁用CopyLocal.



2> Shahyad Shar..:

几个月前我遇到了同样的问题.

VS C#项目文件(.csproj文件)中有两种类型的文件复制:

    具有"复制本地"属性的引用程序集.当属性为True时,程序集将复制到输出路径中.

    具有"复制到输出目录"属性的其他文件.当属性设置为"始终复制"或"复制如果更新"时,文件将复制到输出路径中.

问题:

答:如果同时构建了两个或多个项目,并且其中两个尝试将同一文件复制到输出目录中,则可能会遇到错误,如"错误MSB3021:无法复制文件","访问路径被拒绝" ,"进程无法访问文件"等.

B:如果两个或多个项目引用了一个具有类型2的项目的公共项目.在这种情况下,在项目的并行构建期间,其中两个可能会尝试同时构建公共项目的"GetCopyToOutputDirectoryItems"目标.所以你可能再次遇到上述例外情况.

解决方法1:

强制不同.csproj文件的OutputPath不在同一路径中

http://social.msdn.microsoft.com/Forums/is/tfsbuild/thread/a62a6f98-ec44-46c1-a0d0-7f441f0db973

溶液2:

步骤1:解决方案是为项目中的所有常见项目之外的所有项目设置公共项目的属性(在案例1中为False,在案例2中为"不复制").或者删除它们如果可能的话.

为了找到潜在的错误,您可以在文件*.csproj中搜索单词"private"(对于案例1)和"CopyToOutputDirectory"(对于案例2)

第2步: ...

祝好运



3> Nick Kashtan..:

MS Build Copy任务具有无证功能,至少谷歌保持沉默.如果设置系统范围的环境变量MSBUILDALWAYSRETRY = 1此任务将重试复制文件,即使它在复制操作期间获得Access Denied异常

输出示例

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.


https://github.com/Microsoft/msbuild/blob/master/src/XMakeTasks/Copy.cs
推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有