我可以使用 Haskell 的堆栈来编译并且 运行 _only_ 测试吗?

Can I use Haskell's stack to compile and run _only_ the tests?

当我 运行 a 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)

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

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

我使用 stack build <pkgname>:test:<testsuite> 做了一些实验,当你将所有 app/src/main 都放在一个 目录 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: []

请注意,您需要包含一个 "dummy" 库部分才能使其编译,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 而无需重建 lib and/or app 部分,但堆栈足够智能,如果你之前更改它,则可以重建 lib 部分你 运行 测试。

更新

为了将来参考这里是 link 打开的工单:

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