我可以使用 Haskell 的堆栈来编译并且 运行 _only_ 测试吗?
Can I use Haskell's stack to compile and run _only_ the tests?
当我 运行 a 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)
我已经查看了可用的命令行标志和堆栈文档。我还尝试 google 搜索以查看是否有人谈论过类似的事情。
所以我的问题是:
1. 目前最好的编译和 运行 仅 测试的方法是什么?我对此的最佳猜测是尝试将测试放在单独的 cabal 包中。
2. 堆栈没有或不能这样做有什么原因吗?
我使用 stack build <pkgname>:test:<testsuite>
做了一些实验,当你将所有 app/src/main 都放在一个 目录 cabal-project 中时,我发现没有什么真正令人愉快的。
现在我没有调查这是由于堆栈使用 Cabal
作为库造成的问题还是堆栈问题。
这里有一些可能相关的问题
- Turning on test coverage rebuilds all packages #1940
- stack ghci foo:test:bar uses library dependencies unless --test is passed #1845
- Allow stack test to skip certain test suites #1659
- How to specify a subset of tests to run? #2519
- "stack test " does not run tests? #1961
但我想如果没有人提供更好的答案,您将不得不提交错误。
一个可能但非常丑陋的解决方案(在我看来)是将测试套件、应用程序和库拆分为单独的 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
当我 运行 a 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)
我已经查看了可用的命令行标志和堆栈文档。我还尝试 google 搜索以查看是否有人谈论过类似的事情。
所以我的问题是:
1. 目前最好的编译和 运行 仅 测试的方法是什么?我对此的最佳猜测是尝试将测试放在单独的 cabal 包中。
2. 堆栈没有或不能这样做有什么原因吗?
我使用 stack build <pkgname>:test:<testsuite>
做了一些实验,当你将所有 app/src/main 都放在一个 目录 cabal-project 中时,我发现没有什么真正令人愉快的。
现在我没有调查这是由于堆栈使用 Cabal
作为库造成的问题还是堆栈问题。
这里有一些可能相关的问题
- Turning on test coverage rebuilds all packages #1940
- stack ghci foo:test:bar uses library dependencies unless --test is passed #1845
- Allow stack test to skip certain test suites #1659
- How to specify a subset of tests to run? #2519
- "stack test " does not run tests? #1961
但我想如果没有人提供更好的答案,您将不得不提交错误。
一个可能但非常丑陋的解决方案(在我看来)是将测试套件、应用程序和库拆分为单独的 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 打开的工单: