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

标签 .net tfs msbuild moles pex-and-moles

运行 Moles 0.94 以剔除 3rdparty 程序集中的某些类型,否则这些类型将难以测试。在本地运行良好,测试通过并且解决方案编译良好。第一次编译确实需要相当长的时间,因为它会生成鼹鼠程序集(将它们放入名为\molesassemblies 的子文件夹中),但随后的编译速度要快得多 - 鼹鼠会输出以下内容:

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

问题是,我如何在每次重新同步(拆除)工作区的构建服务器上模仿这种行为?这可能吗? (目前使用 TFS 2010 作为构建服务器)。

我天真地尝试检查名为\molesassemblies\的项目子文件夹的内容,希望当 msbuild 在解决方案编译期间调用 moles 框架时,它会识别程序集已经存在,从而跳过代码生成。然而,只是这样做似乎并没有奏效。框架似乎认为它需要重新生成代码,然后提示 checkin 的程序集是只读的:

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.

任何有关我可以做些什么来使这项工作正常进行的指导都将不胜感激。

谢谢。

最佳答案

不幸的是,这里没有很好的答案。 Moles 程序集过去常常被检入源代码控制和测试项目的一部分,然后 Moles 团队更改了此功能,因为每次 API 更改时人们都必须 check out 和检入 DLL,但没有人真正喜欢这样,因为它既麻烦又烦人。现在只 checkin 了 Mole 的 XML list 。鉴于此,您有几个我能想到的选项:

1- 通过将 Process 选项卡上的 Clean Workspace 字段设置为 None 或 Outputs 更改您的 TFS Build 定义以在构建之间保持您的工作空间,看看是否有帮助

2- 将您的 Moles 程序集托管在源代码控制之外的某个地方,并将它们作为预构建任务复制到有问题的测试项目中。

关于.net - 在构建服务器上运行 Moles - 有什么想法可以跳过代码生成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8242031/

相关文章:

c# - 使用 XmlSerializer 时如何添加换行符

tfs - 如何在将 TFS 克隆到 Windows Powershell 中的 git 时传递用户名和密码

TFS NuGet 恢复包不工作 - Microsoft.webapplication.targets

tfs - 如何检查 TFS 2008 变更集已合并到哪些分支?

msbuild - 在TFS在线构建后如何访问artifacts文件夹?

visual-studio-2010 - 在不打开 IDE 的情况下从 Visual Studio 控制台运行解决方案

c# - 从目录中选择随机文件

c# - 使用存储过程连接数据库中的 4 个表?

.net - 如何在单独的文件(不是.csproj或app.config)中定义条件编译符号

javascript - 将 resx 编译为 Javascript