为什么 `stack build` 不打印警告,而 `stack ghci` 打印警告?

why `stack build` doesn't print the warning, but `stack ghci` does?

我有一个新项目,代码如下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

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

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

我不知道为什么 stack ghci 会这样,但我认为 REPL 在某些多目标或多项目配置方面存在问题,所以我并不感到惊讶它在这里做错了。