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

如何仅在编译为Haskell库时禁用-Werror编译选项?

解决方案

一、修改上游库配置(最彻底)

将-Werror直接写入库全局ghc-options属于不良实践,该配置会随包发布传递给所有下游依赖,不同GHC版本的警告规则差异极易触发下游编译失败,按以下方式修改即可:

  • 移除全局ghc-options中的-Werror配置,仅保留-Wall等通用警告选项
  • 本地开发需要-Werror做严格检查时,可通过以下两种不影响下游的方式实现:
    1. 新增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
    
    1. 若使用Stack做开发,直接将-Werror放到项目根目录stack.yaml的ghc-options配置中,该配置仅作用于本地开发环境,不会随包发布。
  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:27:03