【问题标题】:why `stack build` doesn't print the warning, but `stack ghci` does?为什么 `stack build` 不打印警告,但 `stack ghci` 会?
【发布时间】:2018-08-30 22:14:48
【问题描述】:

我有一个新项目,Lib.hs中有如下代码

data ABC
  = A
  | B
  | C

abc :: ABC -> Int
abc A = 1
abc B = 2

我希望 stack build 失败并提示我我没有处理 abc C

我在package.yaml 中打开了以下标志:

library:
  source-dirs: src

executables:
  tt-exe:
    main:                Main.hs
    source-dirs:         app
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - tt

但是stack build 编译时没有警告,没有错误。但是,stack ghci 能够给我以下警告:

/Users/leo/zhangchiqing/te/tt/src/Lib.hs:11:1: warning: [-Wincomplete-patterns]
    Pattern match(es) are non-exhaustive
    In an equation for ‘abc’: Patterns not matched: C
   |
11 | abc A = 1
   | ^^^^^^^^^...

我错过了什么吗,为什么stack build 没有失败?

GHC 版本 8.2.2,堆栈解析器:lts-11.1

【问题讨论】:

    标签: haskell haskell-stack


    【解决方案1】:

    您已经为tt-exe 可执行目标设置了各种GHC 选项,由于source-dirs 设置,它对应于app/ 目录,但您的Lib.hs 文件似乎位于src/ 目录中。据推测,该目录包含library 目标的源代码,该目标具有一组单独的 GHC 选项。

    您需要为相关目标指定这些选项,以便stack build 正确应用它们。但是,由于您使用的是 hpack,您也可以将它们提取到顶级 ghc-options 部分,该部分将在所有目标之间共享。任一解决方案都应使 stack build 产生您期望的警告。

    我不知道为什么stack ghci 的行为方式如此,但我认为 REPL 在某些多目标或多项目配置方面存在问题,所以我并不完全惊讶它做错了什么在这里。

    【讨论】:

    • 谢谢 Alexis,我尝试了你的建议,并删除了缓存的 cabal 文件,但还是不行,stack build 又通过了。我已经更新了我在帖子中的更改。我还是错过了什么吗?
    • 没关系。现在可以了。我应该将它们添加到顶级 ghc-options 或 library.ghc-options 中。但不是两者都有! :p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多