在构建服务器上运行Moles - 有什么方法可以跳过代码生成吗?

3

为了模拟第三方程序集中某些难以测试的类型,在本地运行 Moles 0.94。在本地使用效果很好,测试通过并且解决方案编译也很顺利。首次编译需要花费一定时间,因为它会生成模拟程序集(并将其放入一个名为\molesassemblies的子文件夹中),但后续编译速度更快 - Moles 会输出以下内容:

Moles : info : compilation : assembly metadata hash unchanged, skipping code generation

问题是,如何在每次重新同步(拆除)工作区的构建服务器上模仿此行为?这真的可能吗?(目前使用TFS 2010作为构建服务器)。
我天真地尝试了检入名为\molesassemblies\的项目子文件夹的内容,希望当msbuild在解决方案编译期间调用摩尔斯框架时,它会认识到这些程序集已经存在,从而跳过代码生成。然而,仅仅这样做似乎并没有起作用。该框架似乎认为它需要重新生成代码,然后抱怨已检入的程序集是只读的:
00:00:00.00> moles
    Moles : info : metadata : ignoring reference D:\Builds\49\mycompany\BUILD-NAME\Sources\Products\Product\Tests\TestHelpers\MolesAssemblies\3rdparty.assembly.moles.dll
    Moles : info : metadata : loading D:\Builds\49\mycompany\BUILD-NAME\Sources\3rdPartyBinaries\3rdparty\3rdparty.assembly.dll
    Moles : info : compilation : output assembly name: 3rdparty.assembly.moles
    Moles : info : code : found 2912 types
    Moles : info : code : visibility: exported or assembly(3rdparty.assembly.moles)
    00:00:03.10> code generation
      Moles : info : code : generating code at D:\Builds\49\mycompany\BUILD-NAME\Sources\Products\Product\Tests\TestHelpers\obj\Release\Moles\sk\m.g.cs
      00:00:03.44> stubs generation
        Moles : info : code : generated 2274 stub types
      00:00:08.32> moles generation
        Moles : info : code : generated 2638 mole types
    00:00:45.13> compiling
Moles : error : compilation : D:\Builds\49\mycompany\BUILD-NAME\Sources\Products\Product\Tests\TestHelpers\MolesAssemblies\3rdparty.assembly.moles.dll readonly [D:\Builds\49\mycompany\BUILD-NAME\Sources\Products\Product\Tests\TestHelpers\TestHelpers.csproj]
  00:02:27.44> moles generator 1 errors, 0 warnings
C:\Program Files\Microsoft Moles\bin\Microsoft.Moles.targets(79,5): error MSB3073: The command ""C:\Program Files\Microsoft Moles\bin\moles.exe" @D:\Builds\49\mycompany\BUILD-NAME\Sources\Products\Product\Tests\TestHelpers\obj\Release\Moles\moles.args" exited with code -1009. [D:\Builds\49\mycompany\BUILD-NAME\Sources\Products\Product\Tests\TestHelpers\TestHelpers.csproj]
  Result: error while copying output (-1009 - 0xfffffc0f)
  MolesAssemblies:
    3rdparty.assembly.moles ignored because already referenced from other location
Done Building Project "D:\Builds\49\mycompany\BUILD-NAME\Sources\Products\Product\Tests\TestHelpers\TestHelpers.csproj" (default targets) -- FAILED.

任何关于如何让这个工作的指导都将不胜感激。谢谢。
1个回答

2

很遗憾这里没有一个很好的答案。以前,Moles组件被检入源代码控制并成为测试项目的一部分,然后Moles团队改变了这个功能,因为每次API更改时人们必须检出和检入DLL,而且没有人真正喜欢这样做,因为它很繁琐和恼人。现在,只有要Mole的XML清单被检入。鉴于此,我想到了几个选项:

1- 更改您的TFS构建定义,通过在“进程”选项卡上设置“Clean Workspace”字段为“None”或“Outputs”,保留构建之间的工作区,并查看是否有所帮助

2- 将您的Moles组件托管到源代码控制之外的某个地方,并将其作为先前生成的任务复制到有问题的测试项目中。


非常好的答案!谢谢。我一定会尝试让我们的发布/配置团队执行(1),看看是否有效。关于(2),我理解远离检查经常更改的代码的dll的理由,但在0.93 Peli似乎正在证明检查他认为是“平台”程序集的合理性,这些程序集很大且不经常更改:[链接](http://social.msdn.microsoft.com/Forums/en/pex/thread/70530f9f-d119-4ad4-b8a5-910121b5a74e),因此我想知道他们是否完全排除了它在0.94中。我可以尝试将它们复制为预构建任务...看看是否有效。 - chrislewisdev
我们尝试了(1),它将我们的端到端构建速度从> 20分钟加快到8.1分钟。太棒了! - chrislewisdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接