【问题标题】:Nunit has a path length limitation?Nunit 有路径长度限制吗?
【发布时间】:2016-02-02 18:02:14
【问题描述】:

在 MSBuild 项目中运行 Nunit 控制台会构建一个命令以执行测试,该命令包含大约 90 个路径,每个路径都是已编译测试项目 (.test.dll) 的完整路径,并且至少包含 100 个字符,但不超过 150 个。

脚本运行时出现以下错误:

NUnit version 2.5.10.11092
 Copyright (C) 2002-2009 Charlie Poole.
 Copyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.
 Copyright (C) 2000-2002 Philip Craig.
 All Rights Reserved.

 Runtime Environment -
    OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1
   CLR Version: 2.0.50727.5485 ( Net 2.0 )

 ProcessModel: Default    DomainUsage: Multiple
 Execution Runtime: Default
 Unhandled Exception:


System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Builds\123\XXXX\XXX.Build.Sonar\srcDroplocation\Build\x86\Release\xxxxx.xxxx.CustomTypes.Test.dll'.
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights
 , FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolea
 n bFromProxy)
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
    at NUnit.Core.AssemblyReader.CalcHeaderOffsets()
    at NUnit.Core.AssemblyReader..ctor(String assemblyPath)
    at NUnit.Util.RuntimeFrameworkSelector.SelectRuntimeFramework(TestPackage package)
    at NUnit.Util.DefaultTestRunnerFactory.GetTargetProcessModel(TestPackage package)
    at NUnit.Util.DefaultTestRunnerFactory.MakeTestRunner(TestPackage package)
    at NUnit.ConsoleRunner.ConsoleUi.Execute(ConsoleOptions options)
    at NUnit.ConsoleRunner.Runner.Main(String[] args)

这个文件的原始路径是'C:\Builds\123\XXXX\XXX.Build.Sonar\src\Droplocation\Build\x86\Release\xxxxx.xxxx.CustomTypes.Test.dll'。该文件存在,我注意到在异常中 src 和 Droplocation 之间的路径中缺少反斜杠。

这个问题发生在我的构建服务器上,在我的本地机器上工作,不同之处在于我的本地机器上的文件夹不是那么深:'C:\T\XXX\Droplocation\Build\x86\Release\xxxxx. xxxx.CustomTypes.Test.dll'

NUnit的使用路径有什么限制吗?

我还尝试创建一个 .nunit 文件以将所有引用放在上面,但这会导致另一个问题

【问题讨论】:

  • 更新:我将配置更改为调试,并且发生了类似的事情,但路径不同,现在异常中缺少的字符不是反斜杠,而是一个字母。它找不到文件。是的,我检查原始路径发送给命令,是正确的。
  • 路径中有多少个字符是缺失的?我很好奇是否每次都丢弃相同的位置。构建脚本中是否有任何字符串替换命令?
  • 对于 debug 的情况是 87 个字符,当设置为 Release 时是 40 个字符。但是,如果我从 NUnit 控制台的参数开头开始计算已删除字符的位置,它们都出现在第 8005 个位置

标签: msbuild filepath nunit-console


【解决方案1】:

确实是 NUnit 版本 2.5.10.11092 中的错误。

  1. 创建指向 C:\Builds\123\XXXX\XXX.Build.Sonar\src\Droplocation 的驱动单元

subst t: C:\Builds\123\XXXX\XXX.Build.Sonar\src\Droplocation

  1. 将 $(OutDir) 从 C:\Builds\123\XXXX\XXX.Build.Sonar\src\Droplocation 更改为 t:

【讨论】:

    【解决方案2】:

    路径中间缺少的斜线是由构建脚本引起的,而不是 NUnit。我的猜测是构建脚本将两个字符串附加在一起,这两个字符串都没有必要的斜杠。如果相同的构建脚本在你的机器上运行,它可能是服务器上的一个全局变量,没有你机器上的变量的开始/结束斜杠。

    编辑:根据您上面的评论,您可能遇到了 Windows 限制。根据this support page,命令提示符限制为 8191 个字符。此限制是在扩展任何环境变量之后。您可能需要减少参数数量或让构建服务器编译到更短的路径。

    【讨论】:

    • 对不起,缺少的斜线只出现在异常的消息中。 Msbuild 脚本中的错误是我的第一个猜测,但我检查并仔细检查,但 MSBuild 提供的路径是正确的,事实上 Msbuild 脚本没有附加两个字符串。
    • $(OutDir) 只设置一次完整路径,所以它是没有附加字符串。此外,我打印命令并逐个检查路径,它们都可以,触发异常的不是第一个。
    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 2015-10-22
    • 2010-12-23
    • 1970-01-01
    • 2020-08-23
    • 2011-01-17
    • 1970-01-01
    • 2014-04-28
    相关资源
    最近更新 更多