如何在PowerShell终端通过Stack构建时让GHC错误消息正确格式化?
我碰到过好几个开发者问过类似的问题——明明用GHC直接编译时能看到清晰美观的错误提示,但换成Stack构建就要么看不到完整错误,要么输出格式不对劲。咱们先把你遇到的情况理清楚:
正常的GHC直接编译输出
当你在PowerShell里直接调用GHC编译时,它会直接把详细的错误信息打印到终端,格式清晰还带代码定位:
PS > ghc .\src\XXX.hs -package ghc -package ghc-paths -package filepath [1 of 1] Compiling XXX ( src\XXX.hs, src\XXX.o ) src\XXX.hs:340:9: error: parse error on input `<-' Perhaps this statement should be within a 'do' block? | 340 | blah <- blah blah blah | ^^
Stack构建的异常表现
但用Stack构建时,输出到Preprocessing library ...就没下文了,看不到具体的错误细节:
PS > stack build XXX-0.1.0.0: build (lib + exe) Preprocessing library ...
为什么会出现这种差异?
Stack默认会捕获GHC的输出,并且可能因为构建阶段的日志策略、缓存机制或者输出重定向,导致错误信息没有实时显示出来。常见的原因有这几个:
- Stack默认会把构建日志缓存起来,只有当构建完全失败后才会展示部分错误,或者需要手动查看日志
- Stack的默认输出级别比较低,会过滤掉一些详细的编译信息
- 当构建项目包含库和可执行文件时,Stack可能在预处理阶段就卡住,但没把后续的错误输出到终端
解决办法:让Stack显示完整的错误信息
你可以试试这几个方法,让Stack输出和GHC一样详细的错误提示:
提高日志输出级别
使用--verbose(或者简写-v)参数,让Stack打印所有构建细节,包括GHC的完整错误信息:stack build --verbose如果觉得太啰嗦,也可以用
--verbose=warn或者--verbose=error来只看警告和错误级别的信息。强制实时输出编译错误
添加--ghc-options="-v"参数,让GHC本身输出详细信息,并且Stack会把这些信息实时传递到终端:stack build --ghc-options="-v"查看Stack的构建日志文件
如果上面的方法还是看不到,Stack会把构建日志存在项目的.stack-work/logs目录下,你可以直接查看对应的日志文件,里面会有完整的GHC错误信息:Get-Content .\.stack-work\logs\XXX-0.1.0.0.log禁用Stack的输出缓冲
有时候输出缓冲会导致错误信息不实时显示,你可以设置环境变量禁用缓冲:$env:STACK_NO_BUFFER="1" stack build
这些方法应该能让你在Stack构建时看到和GHC直接编译一样清晰的错误提示了。
内容的提问来源于stack exchange,提问作者user3048859

