TFS 2012构建"拒绝访问路径"

Nim*_*joe 65 tfs build access-denied

我正在使用TFS 2012 Build并遇到错误

拒绝访问该路径

正在构建的解决方案包含大约15个项目,其中一些项目正在使用Castle.Components.Validator.2.5.0程序集.

我已经看过其他帖子谈论TFS Build Access Denied错误,但它们通常指的是同时构建运行.在这种情况下,一次只运行一个构建.此外,重新启动服务器或构建尚未运行一段时间时会发生错误.

一旦构建运行并失败,下一个构建成功,并且每个构建成功后再次成功,直到构建尚未运行一段时间或服务器重新启动.虽然我们可以解决这个问题,但这是一个手动头痛的问题.

这是错误:

C:\ WINDOWS\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(3513):无法复制文件"D:\ Builds\12\Foo\Check-In Build\Sources\packages\Castle.Components .Validator.2.5.0\lib\NET40\Castle.Components.Validator.dll"to"D:\ Builds\12\Foo\Check-In Build\Binaries\Castle.Components.Validator.dll".

访问路径'D:\ Builds\12\Foo\Check-In Build\Binaries\Castle.Components.Validator.dll'被拒绝.

查看日志文件时,您可以看到构建正在尝试将文件复制两次.因为第一个锁定文件,第二个失败,因此构建失败.以下是日志文件的片段,其中显示了正在发生的事情:

2> _CopyFilesMarkedCopyLocal:将文件从"D:\ Builds\12\Foo\Check-In Build\Sources\packages\Castle.Components.Validator.2.5.0\lib\NET40\Castle.Components.Validator.dll"复制到" D:\ Builds\12\Foo\Check-In Build\Binaries\Castle.Components.Validator.dll".

5> _CopyFilesMarkedCopyLocal:将文件从"D:\ Builds\12\Foo\Check-In Build\Sources\packages\Castle.Components.Validator.2.5.0\lib\NET40\Castle.Components.Validator.dll"复制到" D:\ Builds\12\Foo\Check-In Build\Binaries\Castle.Components.Validator.dll".

2> _CopyFilesMarkedCopyLocal:将文件从"D:\ Builds\12\Foo\Check-In Build\Sources\packages\MvcContrib.Mvc3.FluentHtml-ci.3.0.96.0\lib\MvcContrib.FluentHtml.dll"复制到"D:\Builds\12\Foo\Check-In Build\Binaries\MvcContrib.FluentHtml.dll".将文件从"D:\ Builds\12\Foo\Check-In Build\Sources\packages\RhinoMocks.3.6\lib\Rhino.Mocks.dll"复制到"D:\ Builds\12\Foo\Check-In Build \二进制文件\ Rhino.Mocks.dll".

任何有关如何解决这个问题的帮助将不胜感激.

Mik*_*sdf 49

正如其他人所提到的,当使用公共目标目录执行多线程构建并且文件复制任务碰巧遇到与为不同项目运行的复制任务同时发生冲突时,会发生这种情况.

通常,这应该导致"另一个进程使用的文件"异常(由文件复制任务处理和重试),但有时文件操作会导致"访问被拒绝"异常.(我还不确定为什么)

有人建议您应该"解决重复问题",但我不认为这对于所有项目都需要直接引用像log4net这样的库的情况是不可行的.

显然,防止该问题的一种方法是使用/p:BuildInParallel=falseor /m:1或显式运行msbuild /maxcpucount:1(或完全省略参数)以强制使用单线程模式.

但是,在TFS 2013中,默认构建模板会自动将/m(使用所有核心)传递给msbuild,它会静默覆盖您可以手动传入的任何单线程设置.(由我自己的实验和检查诊断日志确定)

我尝试的另一种解决方法是手动传递/p:AllowedReferenceRelatedFileExtensions=none给msbuild,这可以防止从引用的库中复制所有pdb和xml文件.(因为有一段时间我只看到有这个问题的xml文件.)但后来我一直遇到log4net.dll问题.

我使用的最终解决方法是通过反编译源代码而发现的Microsoft.Build.Tasks.Copy:

if (hrForException == -2147024891)
{
    if (!Copy.alwaysRetryCopy)
        throw;
    else
        this.LogDiagnostic("Retrying on ERROR_ACCESS_DENIED because MSBUILDALWAYSRETRY = 1", new object[0]);
}
Run Code Online (Sandbox Code Playgroud)

如果发生错误-2147024891(0x80070005访问被拒绝),则复制任务将检查特殊变量以查看是否应重试.该值通过环境变量设置:

Copy.alwaysRetryCopy = Environment.GetEnvironmentVariable("MSBUILDALWAYSRETRY") != null;
Run Code Online (Sandbox Code Playgroud)

设置环境变量MSBUILDALWAYSRETRY = 1(并重新启动构建服务器)后,问题就消失了.而且我还定期开始看到"重试上ERROR_ACCESS_DENIED ......"作为构建日志警告,证明此设置已生效,(而不是仅仅建立成功巧合).

(请注意,此环境变量没有详细记录,请视情况使用.)

更新:显然TFS 2015不再覆盖您/m:1/m(甚至在遗留/ XAML构建定义上),这应该/m:1再次进行有效的修复.

  • 这是一个PowerShell片段,用于创建**环境变量**并重新启动**TFS主机服务**(*名称取决于TFS控制器版本*)`[Environment] :: SetEnvironmentVariable("MSBUILDALWAYSRETRY","1", "机器")``restart-Service TFSBuildServiceHost.2012` (5认同)
  • TfvcTemplate.12.xaml似乎适用于/ m:1但不适用于/ p:BuildInParallel = false (2认同)
  • 这个MSBUILDALWAYSRETRY黑客很讨厌,但至少它让我知道MS像我一样厌倦了这种废话,并且确实没有什么我想念的.是时候向我的构建服务器启动清单添加另一个步骤了. (2认同)

Buc*_*ges 41

看起来有两个项目正在复制同一个文件.根据时间安排,它们有时会同时发生,从而导致失败.您必须追溯节点ID以查找源项目.有关可能跟踪的更多详细信息和代码,请参见http://blogs.msdn.com/b/buckh/archive/2012/01/21/a-tool-to-find-duplicate-copies-in-a-build.aspx它适合你.

  • 巴克 - 谢谢你的快速回复.您的评论和链接有助于理解问题.我们使用的旧构建服务器不是多进程服务器,因此构建只运行一个proc.我们的新构建服务器是多进程的,现在构建在多个处理器上执行,导致文件冲突.在这种特殊情况下,不需要加速构建,因此我将设置MSBuild Multi-Proc(在构建过程模板中的Process/Advanced下)更改为False.事实上,它对构建性能产生了不明显的影响. (6认同)
  • 作为这种情况的另一种选择,如果我需要多进程容量,我知道使用此引用共享哪些项目,我会想出一个策略,例如将项目设置为此程序集的CopyLocal = False,并使用共享文件夹目录,项目可以引用程序集. (3认同)

Ace*_*Ace 13

正如Buck Hodges和Nimblejoe所说的那样,这主要是因为TFS默认运行多个MSBuild进程来构建你的项目.

您可以通过添加MSBuild参数/ p:BuildInParallel = falseProcess - > 3. Advanced - > MSBuild Arguments中的构建定义中覆盖它.

  • 或者只是在下面的设置中将`MSBuild Multi-Proc`设置为`false`. (5认同)
  • @stuartd这在2013年被删除TfvcTemplate.12.template http://www.garyhowlett.co.uk/2013/11/07/adding-back-the-msbuild-multiproc-option-in-tfvctemplate-12-xaml/ (4认同)

Sti*_*ack 11

如果您打开了构建代理的文件夹,也会发生这种情况.


Zig*_*ler 7

我也有同样的问题.我收到的错误消息与无法复制相关,因为访问路径被拒绝.在我的情况下,所有我的dll和xml文件等都放在D:\ TFS\Example\Bin\Debug文件夹中.

我右键单击Bin文件夹并单击属性,并在"属性"下看到"只读"复选框.

我取消选中了"只读"复选框,然后在显示的新弹出窗口中单击"确定"并单击"确定".

我回到Visual Studio并构建我的解决方案,它给了我错误消息.

Voilaa ..这次它成功构建没有错误.

我不知道这是否完美,但我这样做是为了解决我的问题.