【问题标题】:How to configure NUnit in CruiseControl.NET with Copy Local = false如何使用 Copy Local = false 在 CruiseControl.NET 中配置 NUnit
【发布时间】:2012-12-05 02:54:58
【问题描述】:

我正在配置我公司的构建服务器(运行 CruiseControl.NET)以运行 NUnit 测试。为了通过减少文件 IO 来缩短构建时间,构建设置为使用自定义目标文件关闭 Copy Local(基本上如下所示:How do I override CopyLocal (Private) setting for references in .NET from MSBUILD)。但是,当在构建服务器上为引用其他程序集的测试项目运行 NUnit 时,Copy Local = false 会引发运行时程序集绑定错误(“无法加载文件或程序集”),因为这些程序集未复制到 /bin 目录中测试项目。

我可以打开 Copy Local 以使其工作,但这会减慢构建速度。我想知道,我是否可以使用一种策略来在构建服务器上运行 NUnit 测试,同时保持 Copy Local = false?我认为这种情况以前也适用于其他人,但我遗漏了一些明显的东西。

作为参考,下面是我在 CruiseControl.NET 构建配置中运行每个测试项目的方式:

<exec>
     <executable>nunit-console.exe</executable>
     <baseDirectory>C:\Program Files\NUnit 2.6\bin</baseDirectory>     
     <buildArgs>C:\Source\UnitTests.csproj /xml:C:\BuildLogs;\$(ProjectName)\NUnitResults\nunit-results.xml</buildArgs>
</exec> 

【问题讨论】:

  • 文件复制真的要花那么多时间吗?听起来您可能需要一个更好的构建框,或者可能将构建拆分为几个较小的构建来处理单独的模块。
  • @Pedro 不幸的是,我没有任何数字可供比较,但有人告诉我这是构建时间的“显着”增加(这与我的观察相符)。您可能是对的,这归结为构建框(尤其是磁盘)是瓶颈。如果我的设置没有什么奇怪的,那么这给了我弹药来获得更好的构建服务器:)

标签: .net nunit cruisecontrol.net


【解决方案1】:

在运行时,例如,在测试执行期间,您需要以某种方式定位引用的程序集。我想不出一种简单的方法来避免最终复制到测试项目的输出目录,而且我不相信这个最终复制操作会显着减慢您的构建过程。

如果您有一个包含大量项目的庞大解决方案,并且围绕程序集复制许多依赖项可能会成为问题。

示例:

假设您的解决方案中有 26 个名为 AZ 的项目,A 不依赖于任何东西,B 依赖于 AC 依赖于 B...你得到这个想法。 Z 是你的测试项目。正如我所说:我想不出在测试执行期间避免在Z 的输出目录中出现A.dllY.dll 的方法。

如果你保持标准项目配置A被编译成A.dll并复制到[SolutionDir]\A\bin\[Configuration]\。然后B被编译为B.dll并与A.dll一起复制到[SolutionDir]\B\bin\[Configuration]\。然后C被编译为C.dll并与A.dllB.dll一起复制到[SolutionDir]\C\bin\[Configuration]\。这样A.dll 被复制了 26 次,B.dll 被复制了 25 次,以此类推。

在这种情况下,我的建议是让所有项目的输出目录指向单个解决方案输出目录,例如[SolutionDir]\bin。这就是加速我们构建过程的原因。

【讨论】:

  • 谢谢,我也在考虑程序集的“主”输出目录,但认为正确的方法(无需额外工作)是使用测试项目的输出 bin 目录。我认为我在这里遇到的真正问题是硬件种类(构建具有磁盘 IO 问题的服务器),而不是构建配置的设置方式。当我得到硬件时,我将切换到 CopyLocal = true。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多