无法构建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中添加约束:
版本号选择20天前能构建的对应版本(可通过Hackage历史版本页查询)constraints: mysql-haskell == 1.2.0, tls == 1.6.0 - 生成冻结文件固化依赖:
后续构建会自动使用冻结文件中的版本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
相关产品推荐
相关产品推荐

