【问题标题】:How can I specify source files for Cabal/Stack package with more control than just hs-source-dirs/source-dirs?如何为 Cabal/Stack 包指定源文件,而不仅仅是 hs-source-dirs/source-dirs?
【发布时间】:2019-02-28 19:54:02
【问题描述】:

我有一个使用 Stack(因此是 Cabal)构建的 Haskell 项目。 现在我有 src/ 目录和 tests/ 目录,但是我想将测试与源文件混合在一起,这意味着一切都将进入 src/ 目录。

为此,我需要将我的tests build-info 源文件定义为 src/ 中具有 .test.hs 扩展名的文件。 但是,似乎定义源文件的唯一选择是堆栈中的source-dirs 或cabal 中的hs-source-dirs,这意味着我必须将src 设置为source-dirs,这似乎是错误的,因为它也在捕获正常的源文件那么。

这是我的 package.yaml 的一部分:

tests:
  myapp-test:
    main:                Main.hs
    source-dirs:         test
    ...

虽然我希望它是这样的:

tests:
  myapp-test:
    main:                Main.hs
    source-files:         src/**/*.test.hs
    ...

有没有类似的选项,比如源文件,或任何其他方式来做到这一点?谢谢!

【问题讨论】:

  • 我认为没有简单的方法可以做到这一点。我建议您遵守将源代码和测试保存在不同目录中的惯例。如果您想将一小部分包含的模块和测试打包在一起,只需创建另一个库!
  • 你能说一下为什么要将文件混合在一个目录中吗?也许我们可以提出一个替代方案来解决您的顾虑。
  • @DanielWagner 感谢您尝试寻找解决方案!我最近在 javascript 方面做了很多工作,并且约定将测试文件放在源文件旁边。我之前也在项目中工作过,这些项目被分成不同的目录结构,所以我可以比较两者。当它们靠近源文件时,我更喜欢它们,因为它更容易找到和打开它们 -> 我不需要导航两个并行目录结构。我确信有利有弊,但我发现这是smth我喜欢/喜欢。但我很想听听不同的意见。

标签: haskell testing cabal haskell-stack


【解决方案1】:

单独的 srctests 目录是惯例,但不是必须的。 hs-source-dirs 默认为 .

Cabal 自行查找所有源文件。 否则有extra-source-files

您的选择是在模块级别:exposed-modulesother-modules。 您可以将它们用于库和可执行文件。

在您的.cabal 文件中:

  • 每个可执行文件使用一个executable <name> 条目。 main-is 是带有module Main where ... 的文件。
  • 每个库使用一个library <name>
  • 每个测试应用使用一个 test-suite <name> 条目。

    • type 是必填项(例如 type: exitcode-stdio-1.0)。
    • main-is 是测试文件。
    • ghc-options: -main-is <your.hs>
    • 在测试文件中也有一个
      main :: IO ()
      main = hspec spec -- or: spec1 >> spec2
    

阴谋使用:

  cabal new-build
  cabal new-test [<which test>]
  cabal new-run <file without path>

深入dist-newstyle你会发现

  • x 目录下的可执行文件
  • t 目录下的测试可执行文件
  • .sol 目录下的文件

链接:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-04
    • 2019-02-26
    • 2021-12-02
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    相关资源
    最近更新 更多