当我运行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.目前最好的编译和运行 测试的方法是什么?我最好的猜测是尝试将测试放在一个单独的cabal包中
2.堆栈没有或不能做到这一点有什么原因吗?
答案 0 :(得分:4)
我使用stack build <pkgname>:test:<testsuite>
进行了一些实验,当你在一个目录 cabal-project中拥有所有app / src / main时,没有发现任何真正令人满意的事。
现在我没有调查这是否是一个问题,因为使用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: []
请注意,您需要包含一个&#34;虚拟&#34;库部分为了使它编译,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和/或应用程序部分,但堆栈足够智能,如果在运行测试之前更改它,则重建lib部分。
以下参考是打开的票证的链接: