MSBuild&;TeamBuild-BuildInParallel由于MSB3021文件权限冲突而失败

MSBuild&;TeamBuild-BuildInParallel由于MSB3021文件权限冲突而失败,msbuild,tfsbuild,Msbuild,Tfsbuild,我维护一个相当大的软件构建,由大约350个csharp项目组成。我们的调试构建时间大约为17分钟 我一直在寻找提高构建时间的方法,BuildInParallel属性看起来确实很有趣。特别是因为我们有一个四核服务器在进行构建,所以它应该能够真正利用计算能力 但是,唉。。。在设置属性、修改构建代理的配置文件并重新启动它之后,第一次运行看起来确实很有希望,比正常运行快得多,直到它失败为止 查看构建日志后,当构建尝试将标记为CopyLocal=true的引用复制到ouput dir时,它似乎失败了。 如

我维护一个相当大的软件构建,由大约350个csharp项目组成。我们的调试构建时间大约为17分钟

我一直在寻找提高构建时间的方法,BuildInParallel属性看起来确实很有趣。特别是因为我们有一个四核服务器在进行构建,所以它应该能够真正利用计算能力

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

查看构建日志后,当构建尝试将标记为CopyLocal=true的引用复制到ouput dir时,它似乎失败了。 如果C#project A和C#project B是并行构建的,并且两者都引用相同的第三方dll,并试图同时复制它,那么尝试复制文件的第二个进程将获得文件访问冲突-该文件正被另一个进程使用

有没有人经历过这种情况,并且能够在团队构建中使用多进程构建


这里有一个失败的例子,有点难以确定哪个项目同时在建

我已删除所有不相关的内容:

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测试访问器在并行构建时也不会表现良好

您可以从以下几点开始:

  • 通过将private设置为true,禁用引用的CopyLocal行为
  • 在生成依赖项目时,禁用CopyToOutputPath文件的CopyLocal

  • 几个月前我也有同样的问题

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

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

  • 具有“复制到输出目录”属性的其他文件。当属性设置为“始终复制”或“更新时复制”时,文件将复制到输出路径中

  • 问题:

    答:如果同时生成两个或多个项目,并且其中两个项目试图将同一文件复制到输出目录中,则可能会遇到诸如“错误MSB3021:无法复制文件”、“拒绝访问路径”、“进程无法访问文件”等错误

    B:如果两个或多个项目引用了一个具有某些类型2的项目的公共项目。在这种情况下,在并行构建项目的过程中,其中两个可能会同时尝试构建公共项目的“GetCopyToOutputDirectoryItems”目标。因此,您可能再次面临上述例外情况

    解决方案1:

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

    解决方案2:

    步骤1:解决方案是为项目中除一个公共项外的所有公共项设置公共项的属性(在案例1中设置为False,在案例2中设置为“不复制”)。或者,如果可能的话,将其移除

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

    第二步:


    好运

    由于文件为只读,也可能发生这种情况。在这些情况下(也就是说,不是大部分其他答案所涵盖的情况),。

    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的默认行为,如果没有其他解决方法,我不想更改它。很抱歉响应太晚,但非常感谢您的支持