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

Myr*_*yrn 7 haskell haskell-stack

当我运行a stack test或a时stack test <package>:<test-suite>,输出看起来像:

package: configure (lib + exe + test)
package: build (lib + exe + test)
package: copy/register
package: test (suite: tests)
Run Code Online (Sandbox Code Playgroud)

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

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

package: configure (test)
package: build (test)
package: copy/register
package: test (suite: tests)
Run Code Online (Sandbox Code Playgroud)

我已经查看了可用的命令行标志和堆栈文档.我还试图谷歌搜索,看看有没有人谈过类似的东西.

所以我的问题是:
1,什么是编译和运行目前最好的方法只有测试?我最好的猜测是尝试将测试放在一个单独的cabal包中.
2.有没有理由说堆栈不能或不能这样做?

eps*_*lbe 4

我做了一些实验stack build <pkgname>:test:<testsuite>,发现当你将所有 app/src/main 放在一个目录cabal-project 中时,没有什么真正令人愉快的。

\n\n

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

\n\n

以下是一些可能相关的问题

\n\n\n\n

但我想如果没有人提供更好的答案,您就必须提交错误。

\n\n
\n\n

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

\n\n
myproject\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 stackapp            \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app             \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Main.hs     \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ChangeLog.md    \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 LICENSE         \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Setup.hs        \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 stackapp.cabal  \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 stacksrc            \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ChangeLog.md    \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 LICENSE         \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Setup.hs        \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src             \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Lib.hs      \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 stacksrc.cabal  \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 stacktest           \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ChangeLog.md    \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 LICENSE         \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Setup.hs        \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src             \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 stacktest.cabal \n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tst             \n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Spec.hs     \n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 stack.yaml  \n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

堆栈.yaml

\n\n
resolver: lts-7.3\n\npackages:\n- \'./stacksrc\'\n- \'./stacktest\'\n- \'./stackapp\'\nextra-deps: []\nflags: {}\nextra-package-dbs: []\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

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

\n\n
\n

堆栈测试.cabal

\n\n
...\nlibrary\n  -- dummy\n  build-depends:       base >=4.9 && <4.10\n  hs-source-dirs:      src\n  default-language:    Haskell2010\n\ntest-suite tests\n  type:          exitcode-stdio-1.0\n  main-is:       Spec.hs\n  hs-source-dirs: tst\n  build-depends: base\n               , stacksrc\n               , hspec\n               , hspec-expectations-pretty-diff\n\n  default-language: Haskell2010\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

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

\n\n

更新

\n\n

为了供将来参考,这里有一个已打开票证的链接:

\n\n

使用堆栈编译和运行测试#2710

\n