1

我正在配置我公司的构建服务器(运行 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> 
4

1 回答 1

3

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

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

例子:

假设您的解决方案中有 26 个项目A,其中不依赖、依赖、依赖……您明白了。你是测试项目吗?正如我所说:我想不出一种方法来避免在测试执行期间的输出目录中。ZABACBZA.dllY.dllZ

如果您保持标准项目配置A被编译A.dll并复制到[SolutionDir]\A\bin\[Configuration]\. 然后与 to一起B编译并复制到。然后与和一起编译并复制到。这种方式复制26次,复制25次,以此类推。B.dllA.dll[SolutionDir]\B\bin\[Configuration]\CC.dllA.dllB.dll[SolutionDir]\C\bin\[Configuration]\A.dllB.dll

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

于 2012-12-04T18:54:58.673 回答