在沙盒中运行cabal测试

6
假设我有三个自己的包,A、B和C,它们都依赖于Hackage上的许多其他包。我正在使用cabal 1.18。
- C依赖于A和B。 - B依赖于A。 - A和B都有测试套件。
我像这样设置了沙盒:
cd /path/to/sandbox
cabal sandbox init
cabal sandbox add-source /path/to/A
cabal sandbox add-source /path/to/B
cabal sandbox add-source /path/to/C

我想构建所有的软件包,运行自己的软件包中的所有测试套件,但不运行依赖包中的测试套件,并显示完整的测试输出。最好的方法是什么?

选项1

cd /path/to/sandbox
cabal install --enable-tests A B C

问题:

  • 无法将--show-details=always传递给cabal install
  • 测试输出被隐藏在日志文件中而不显示。
  • 如果用户之前做过cabal install A,A不会被重新构建,测试也不会运行。

选项2

cd /path/to/A
cabal sandbox init --sandbox=/path/to/sandbox/.cabal-sandbox
cd /path/to/B
cabal sandbox init --sandbox=/path/to/sandbox/.cabal-sandbox

cd /path/to/A
cabal configure --enable-tests
cabal test --show-details=always
cd /path/to/B
cabal configure --enable-tests
cabal test --show-details=always
cabal install C

问题:

  • 这会导致 A 和 B 库不必要地重新构建。

选项 3

在沙盒 cabal.config 中添加一行 tests: True

问题:

  • 这将导致运行 Hackage 上所有依赖包的测试,非常缓慢并且在某些情况下会失败。

你今天最好的选择是为每个包创建一个沙盒,将每个包的依赖项添加到其自己的沙盒中,然后进入每个沙盒并使用 cabal test 运行测试。 - tibbe
1
这有点尴尬,因为我们实际上正在使用沙盒作为“构建风格”,打开/关闭了优化和其他标志等。 - Ashley Yakeley
1个回答

8
Cabal在这里确实缺少功能。我的计划是将Cabal泛化,使其在更少(或无)"当前软件包"的概念。现在,许多命令都假定您在一个带有.cabal文件的目录中,并且您想要对该软件包执行某些操作。对于大型多软件包项目,情况往往不是这样的,正如您所见。
我想要的是,Cabal为大多数命令(例如build、test、bench等)提供一个目标列表。您可以通过以下方式运行来自多个软件包的测试:
cabal test --show-details=always \
  pkg-dir1:some-test1 pkg-dir1:some-test2 pkg-dir2

上面的例子表明,应该可以只指定某些包的部分内容。

我知道现在这对你并没有太大帮助,但至少你知道我们正在朝着哪个方向前进。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接