【问题标题】:Can I use Haskell's stack to compile and run _only_ the tests?我可以使用 Haskell 的堆栈来编译和运行_only_ 测试吗?
【发布时间】:2016-10-13 19:01:22
【问题描述】:

当我运行 stack teststack test <package>:<test-suite> 时,输出类似于:

package: configure (lib + exe + test)
package: build (lib + exe + test)
package: copy/register
package: test (suite: tests)

它基本上将我所有的更改编译了两次:一次用于 exe 或 lib,第二次用于测试。

我想要的是一个像stack test --test-only 这样的命令,它会产生类似的东西:

package: configure (test)
package: build (test)
package: copy/register
package: test (suite: tests)

我已经查看了可用的命令行标志和堆栈文档。我还尝试了谷歌搜索,看看是否有人谈论过类似的事情。

所以我的问题是:
1. 目前最好的编译和运行测试的方法是什么?我对此的最佳猜测是尝试将测试放在单独的 cabal 包中。
2. stack没有或不能这样做有什么原因吗?

【问题讨论】:

    标签: haskell haskell-stack


    【解决方案1】:

    我使用stack build <pkgname>:test:<testsuite> 进行了一些实验,当您将所有 app/src/main 放在一个 directory cabal-project 中时,并没有发现任何真正令人愉悦的东西。

    现在我没有调查这是否是由于堆栈使用 Cabal 作为库而导致的问题,或者这是否是堆栈问题。

    这里有一些可能相关的问题

    但我想如果没有人提供更好的答案,您将不得不提交错误。


    一个可能但相当丑陋的解决方案(在我看来)是将测试套件、应用程序和库拆分为单独的 cabal 项目 - 这是我用于测试的示例文件夹结构。

    myproject
    ├── stackapp            
    │   ├── app             
    │   │   └── Main.hs     
    │   ├── ChangeLog.md    
    │   ├── LICENSE         
    │   ├── Setup.hs        
    │   └── stackapp.cabal  
    ├── stacksrc            
    │   ├── ChangeLog.md    
    │   ├── LICENSE         
    │   ├── Setup.hs        
    │   ├── src             
    │   │   └── Lib.hs      
    │   └── stacksrc.cabal  
    ├── stacktest           
    │   ├── ChangeLog.md    
    │   ├── LICENSE         
    │   ├── Setup.hs        
    │   ├── src             
    │   ├── stacktest.cabal 
    │   └── tst             
    │       └── Spec.hs     
    └── stack.yaml  
    

    stack.yaml

    resolver: lts-7.3
    
    packages:
    - './stacksrc'
    - './stacktest'
    - './stackapp'
    extra-deps: []
    flags: {}
    extra-package-dbs: []
    

    请注意,您需要包含一个“虚拟”库部分才能使其编译,cabal 对既没有 lib 也没有 exe 部分的 cabal 文件很挑剔。

    stacktest.cabal

    ...
    library
      -- dummy
      build-depends:       base >=4.9 && <4.10
      hs-source-dirs:      src
      default-language:    Haskell2010
    
    test-suite tests
      type:          exitcode-stdio-1.0
      main-is:       Spec.hs
      hs-source-dirs: tst
      build-depends: base
                   , stacksrc
                   , hspec
                   , hspec-expectations-pretty-diff
    
      default-language: Haskell2010
    

    然后您可以修改测试并运行stack stacktests:test:tests,而无需重新构建库和/或应用程序部分,但堆栈足够智能,如果您在运行测试之前对其进行更改,则可以重新构建库部分。

    更新

    为了将来参考,这里是一个打开的票的链接:

    To use stack to compile and run only the tests #2710

    【讨论】:

    • 嗯,这与我得出的结论相同。我想我会在堆栈上打开一个问题。
    • here on github 是我测试过的例子的源代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多