You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Shake构建工具实现错误信息仅单次打印?

问题根因

错误重复打印是由两个独立的输出逻辑导致的:

  • 第一次是ghc进程运行时,直接将错误信息输出到继承自Shake进程的标准错误流,属于实时编译输出
  • 第二次是Shake检测到命令执行失败后,默认会将捕获到的进程stderr内容附加到自身的错误栈信息中再次打印
解决方案

方案1:全局配置(推荐)

直接在Shake构建的入口配置项中添加全局参数,对所有执行的外部命令生效,不需要修改单条cmd调用逻辑:
在shakeOptions中添加shakeCommandOptions = [EchoStderr False]即可,示例代码:

main = shakeArgs shakeOptions{
  shakeCommandOptions = [EchoStderr False],
  -- 其余原有配置项
} $ do
  -- 原有构建规则

该配置的作用是:命令执行失败时,Shake的错误信息不再包含捕获到的stderr内容,仅保留命令、退出码等基础报错信息,避免和已实时输出的错误重复。

方案2:单条命令配置

如果只需要对特定命令(比如ghc编译)关闭重复错误输出,可以在调用cmd/command函数时单独传入EchoStderr False参数:

-- 修改前
cmd "ghc" srcParams compileOpts
-- 修改后
cmd (EchoStderr False) "ghc" srcParams compileOpts

方案3:关闭实时输出,仅报错时打印一次

如果你不需要实时查看编译输出,只希望报错时统一展示一次错误信息,可以在调用cmd时添加CaptureStderr参数,禁止子进程的stderr直接输出到终端:

cmd CaptureStderr "ghc" srcParams compileOpts

该配置下编译过程不会输出任何stderr内容,只有命令执行失败时,Shake会在错误栈中打印唯一一次错误信息。

内容的提问来源于stack exchange,提问作者lbseale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:06:03