如何抑制Stack构建中外包依赖的GHC警告?
如何通过命令行抑制Stack构建中外包依赖的警告
问题描述
我在使用Stack构建项目时,会收到外包依赖包的警告,例如:
happy > /tmp/stack-d6caed253e9f21bf/happy-1.20.0/src/ProduceGLRCode.lhs:224:12: warning: [-Wincomplete-uni-patterns]
176happy > Pattern match(es) are non-exhaustive
我无法修改外包代码,因此不想看到这些警告,但仍希望通过GHC选项-Wall -Werror严格构建自身项目。请问是否有办法通过命令行操作实现?因为涉及大量项目,无法逐个更新stack.yaml。
已尝试的方法
- 在
stack.yaml中配置以下内容,结合命令行--verbosity warn可生效,但无法通过命令行指定该ghc-options配置:ghc-options: "$targets": -Wall -Werror "$everything": -w - 在
stack.yaml中配置apply-ghc-options: targets,但该配置无效,仍会显示外包依赖的警告,且无法从命令行指定。
可行的命令行解决方案
方案1:通过Stack的目标指定GHC选项
直接在构建命令中为当前项目和依赖分别设置GHC选项,利用Stack的占位符区分目标:
stack build --ghc-options="$targets:-Wall -Werror" --ghc-options="$everything:-w" --verbosity warn
$targets:-Wall -Werror:仅对当前项目(本地目标)应用严格的警告检查规则$everything:-w:对所有构建对象(包括第三方依赖)关闭所有警告--verbosity warn:降低日志级别,过滤冗余输出
方案2:临时覆盖Stack配置参数
利用Stack的命令行配置覆盖功能,直接传递ghc-options的临时配置:
stack build --set ghc-options."\$targets"="-Wall -Werror" --set ghc-options."\$everything"="-w" --verbosity warn
注意:这里的\$是为了避免Shell解析变量,确保Stack能正确识别$targets和$everything这两个内置占位符。
方案3:输出过滤(应急方案)
如果上述GHC/Stack层面的配置不生效,可以通过管道过滤掉依赖的警告行,示例如下(以过滤happy依赖的警告为例):
stack build --ghc-options="-Wall -Werror" 2>&1 | grep -v "happy >"
该方式需要根据实际依赖名称调整过滤规则,适合临时场景使用。
内容的提问来源于stack exchange,提问作者Abhijit Sarkar
相关产品推荐
相关产品推荐

