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

无法构建mysql-haskell库:多Haskell版本依赖冲突问题

解决mysql-haskell在多GHC版本下的构建失败问题

问题根源

最近执行cabal update后拉取了最新的Hackage依赖索引,导致mysql-haskell与tls等依赖库的版本兼容性断裂——20天前使用过期索引时,依赖版本处于兼容范围,更新后引入了不兼容的新版本,引发两类错误:

  • 新版本mysql-haskell依赖的tls库缺少Data.Default.Class.Default实例
  • 降级mysql-haskell到1.1.5及以下时,tls库自身构建失败(单独构建tls无问题,说明是版本组合冲突)

解决方案

1. 锁定Hackage索引到20天前的状态

直接回退到之前能构建的依赖索引版本,这是最快恢复的方法:

  • 找到20天前的日期(例如2024-05-10),在构建时指定索引状态:
    cabal update --index-state='2024-05-10T00:00:00Z'
    
  • Dockerfile中替换默认的cabal update为上述命令,确保构建环境依赖与之前一致

2. 使用Stackage快照锁定依赖

针对你提到的有Stackage支持的GHC版本(9.6.6、9.4.8),用对应LTS快照强制依赖版本:

  • 创建/修改cabal.project文件,添加对应快照源:
    # 针对GHC 9.6.6(对应LTS 22.28)
    packages: .
    source-repository-package
      type: git
      location: https://github.com/commercialhaskell/stackage-snapshots
      tag: lts-22.28
    
    # 针对GHC 9.4.8(对应LTS 21.25)
    packages: .
    source-repository-package
      type: git
      location: https://github.com/commercialhaskell/stackage-snapshots
      tag: lts-21.25
    
  • 执行cabal build,Stackage快照会自动拉取经过验证的兼容依赖版本

3. 手动固定依赖版本

如果上述方法无效,手动指定mysql-haskell和tls的兼容版本:

  • 在cabal.project中添加约束:
    constraints: mysql-haskell == 1.2.0, tls == 1.6.0
    
    版本号选择20天前能构建的对应版本(可通过Hackage历史版本页查询)
  • 生成冻结文件固化依赖:
    cabal freeze
    
    后续构建会自动使用冻结文件中的版本

4. 验证单独依赖的版本兼容性

单独构建mysql-haskell指定版本+对应tls版本,确认组合是否可行:

cabal install mysql-haskell-1.2.0 tls-1.6.0 --with-compiler=ghc-9.6.6

如果成功,说明是全局依赖版本冲突,用冻结文件即可解决

内容的提问来源于stack exchange,提问作者Dmitry M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 12:45:06