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再次进行有效的修复.
Buc*_*ges 41
看起来有两个项目正在复制同一个文件.根据时间安排,它们有时会同时发生,从而导致失败.您必须追溯节点ID以查找源项目.有关可能跟踪的更多详细信息和代码,请参见http://blogs.msdn.com/b/buckh/archive/2012/01/21/a-tool-to-find-duplicate-copies-in-a-build.aspx它适合你.
Ace*_*Ace 13
正如Buck Hodges和Nimblejoe所说的那样,这主要是因为TFS默认运行多个MSBuild进程来构建你的项目.
您可以通过添加MSBuild参数/ p:BuildInParallel = false在Process - > 3. Advanced - > MSBuild Arguments中的构建定义中覆盖它.
我也有同样的问题.我收到的错误消息与无法复制相关,因为访问路径被拒绝.在我的情况下,所有我的dll和xml文件等都放在D:\ TFS\Example\Bin\Debug文件夹中.
我右键单击Bin文件夹并单击属性,并在"属性"下看到"只读"复选框.
我取消选中了"只读"复选框,然后在显示的新弹出窗口中单击"确定"并单击"确定".
我回到Visual Studio并构建我的解决方案,它给了我错误消息.
Voilaa ..这次它成功构建没有错误.
我不知道这是否完美,但我这样做是为了解决我的问题.
| 归档时间: |
|
| 查看次数: |
65073 次 |
| 最近记录: |