如何仅在编译为Haskell库时禁用-Werror编译选项?
解决方案
一、修改上游库配置(最彻底)
将-Werror直接写入库全局ghc-options属于不良实践,该配置会随包发布传递给所有下游依赖,不同GHC版本的警告规则差异极易触发下游编译失败,按以下方式修改即可:
- 移除全局
ghc-options中的-Werror配置,仅保留-Wall等通用警告选项 - 本地开发需要
-Werror做严格检查时,可通过以下两种不影响下游的方式实现:- 新增Cabal Flag控制,默认关闭
-Werror,开发时手动开启即可,package.yaml配置示例:
flags: strict-warnings: description: Enable -Werror for development default: false manual: true ghc-options: - -Wall when: - condition: flag(strict-warnings) ghc-options: - -Werror- 若使用Stack做开发,直接将
-Werror放到项目根目录stack.yaml的ghc-options配置中,该配置仅作用于本地开发环境,不会随包发布。
- 新增Cabal Flag控制,默认关闭
- CI环境需要启用
-Werror时,直接在构建命令中传递参数开启即可,比如stack build --flag 你的包名:strict-warnings,不需要写入发布配置。
二、下游临时修复(无法修改上游时使用)
你之前的配置不生效的核心原因是:$everything作用域的配置不能写在下游项目的package.yaml中,package.yaml的ghc-options仅作用于当前项目本身,不会覆盖依赖的配置。
根据你使用的构建工具选择对应配置:
使用Stack构建
将配置写入项目根目录的stack.yaml:
ghc-options: # 替换为实际的上游依赖包名,也可以保留$everything作用到所有依赖 "上游依赖包名": -Wwarn -Wno-unused-imports
使用Cabal构建
将配置写入项目根目录的cabal.project:
package 上游依赖包名 ghc-options: -Wwarn -Wno-unused-imports
如果只需要解决多余MonadFail导入触发的警告,也可以单独添加-Wno-unused-imports选项,针对性更强。
内容的提问来源于stack exchange,提问作者Janus Troelsen
相关产品推荐
相关产品推荐

