我怎样才能让 Shake 只打印一次错误?

How can I get Shake to print errors only once?

如果我在构建过程中遇到错误,我会看到两次

# ghc (for _build/lib/WCLoan.o)
# ghc (for _build/lib/WCLoan.o)
[2 of 2] Compiling WCLoan           ( src/WCLoan.hs, _build/lib/WCLoan.o )

src/WCLoan.hs:18:1: error:
    Parse error: module header, import declaration
    or top-level declaration expected.
   |
18 | imAnError
   | ^^^^^^^^^
Error when running Shake build system:
* _build/lib/WCLoan.o
user error (Development.Shake.cmd, system command failed
Command: ghc -this-unit-id wcloan-0.0.1 src/WCLoan.hs -outputdir_build/lib -isrc:app:test -dynamic-too -O2 -j12 -fPIC -Werror -Wall -package-name wcloan-0.0.1 '-package base
-4.12.0.0' '-package calc-0.0.1' '-package vector-0.12.0.3'
Exit code: 1
Stderr:
src/WCLoan.hs:18:1: error:
    Parse error: module header, import declaration
    or top-level declaration expected.
   |
18 | imAnError
   | ^^^^^^^^^
)

我看到错误发生在构建过程中,然后也显示在

行下方
Error when running Shake build system:

有什么办法让它只显示一次吗?

错误消息来自两个不同的位置:

  • 第一个是通过 Shake 运行并写入 stderr 的命令打印的,并带有一条错误消息。当您执行 cmd ... 时,Shake 默认为 EchoStderr True(将 stderr 流打印到控制台),但您可以传递 EchoStderr False 以不回显 stderr。
  • 第二个是 Haskell 冒出的异常,作为 ShakeException,然后在最后打印出来,包括 stderr。当您执行 cmd ... 时,Shake 默认为 WithStderr True 以将 stderr 包含在异常中,您可以传递 WithStderr False 以不将 stderr 包含在异常中。

但是,由于 Shake 的工作方式,您可能会发现错误消息在完整的 Shake 命令结束之前很长一段时间就出现了。因此,如果您只想查看 stderr 一次,我建议保留 WithStderr 原样。