haskell - 我可以使用 Haskell 的堆栈来编译并_仅_运行测试吗?

标签 haskell haskell-stack

当我运行stack test时或stack 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. 当前编译和运行测试的最佳方法是什么?我对此的最佳猜测是尝试将测试放入单独的阴谋包中。
2.是否有某种原因导致堆栈不这样做或不能这样做?

最佳答案

我使用 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

关于haskell - 我可以使用 Haskell 的堆栈来编译并_仅_运行测试吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40028933/

相关文章:

haskell - 新类型的数据构造函数中的函数定义示例

Haskell 评估时间限制

haskell - 在 Windows 上使用 Stack 编译测试框架时找不到模块 System.Console.MinTTY.Win32

haskell - hlint、hdevtools 和 ghc-mod 之间有什么不同

sorting - 如何在 Haskell 中使用偏序对列表进行排序?

haskell - 为什么 "fmap (replicate 3) Just"的类型为 "a -> [Maybe a]",在 Haskell 中

Haskell Stack 和 C 库

haskell - 我可以将自定义包链接放入 stack.yaml 吗?

haskell - 无法安装GHC-Mod

haskell - 如何从Haskell链接到C#(即托管)DLL?