如何配置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
相关产品推荐
相关产品推荐

