我正在配置我公司的构建服务器(运行CruiseControl.NET)以运行NUnit测试。为了通过减少文件IO来缩短构建时间,构建设置为使用自定义目标文件关闭Copy Local(基本上显示在此处:How do I override CopyLocal (Private) setting for references in .NET from MSBUILD)。但是,在构建服务器上为引用其他程序集的测试项目运行NUnit时,Copy Local = false会引发运行时程序集绑定错误(“无法加载文件或程序集”),因为这些程序集不会复制到该目录的/ bin目录中。测试项目。
我可以打开“复制本地”以使其工作,但这会降低构建速度。我想知道,是否有一种策略可以用来在构建服务器上运行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>
答案 0 :(得分:3)
在运行时,例如,在测试执行期间,您需要以某种方式定位引用的程序集。我想不出一个简单的方法来避免最终复制到测试项目的输出目录,我不相信这个最终的复制操作会大大减慢你的构建过程。
如果您有一个包含大量项目的大型解决方案,并且许多依赖项复制可能是一个问题。
示例:强>
假设您的解决方案中有A
到Z
的26个项目A
取决于任何内容,B
取决于A
,{{1 }取决于C
...你明白了。 B
是你测试项目。正如我所说:在测试执行期间,我无法想到避免在Z
的输出目录中使用A.dll
到Y.dll
的方法。
如果您保持标准项目配置Z
已编译为A
并已复制到A.dll
。然后[SolutionDir]\A\bin\[Configuration]\
汇编为B
并与B.dll
一起复制到A.dll
。然后[SolutionDir]\B\bin\[Configuration]\
汇编为C
,并与C.dll
和A.dll
一起复制到B.dll
。这种方式[SolutionDir]\C\bin\[Configuration]\
被复制26次,A.dll
被复制25次,依此类推。
在这种情况下,我的建议是让所有项目的输出目录指向单个解决方案输出目录,例如B.dll
。这就是涡轮增压我们的构建过程。