使用Cabal编译Haskell项目失败,依赖无法解决求助
首先得明确你遇到的核心矛盾:你的项目MM-0.1.0.0明确要求base >=4.9 && <4.10,但当前系统里装的base版本是4.12.0.0——而Haskell的base库是和GHC版本强绑定的:base 4.9对应GHC 8.0.x系列,base 4.12对应GHC 8.4.x系列,版本不匹配直接导致依赖解析失败,连带cassava ==0.5.*、containers ==0.5.*这些依赖也找不到兼容的版本组合。
下面给你几个可行的解决思路:
1. 切换到匹配的GHC版本
这是最直接的方案,毕竟base版本和GHC绑定死了,你需要安装并切换到支持base 4.9的GHC版本(GHC 8.0.2是这个系列的稳定版):
- 如果你用GHCup管理GHC(非常推荐),执行以下命令:
ghcup install ghc 8.0.2 ghcup set ghc 8.0.2 - 切换完成后,重新运行这组命令试试:
cabal configure cabal install --only-dependencies cabal build
2. 放宽项目的依赖版本约束
如果你的项目代码可以兼容更高版本的base,直接修改项目的.cabal文件里的依赖配置:
- 把
base >=4.9 && <4.10改成base >=4.9 && <4.13(或者更宽的范围,只要代码实际兼容) - 同时调整其他依赖的硬约束,比如把
cassava ==0.5.*改成cassava >=0.5 && <0.6,允许小版本更新 - 修改后运行
cabal new-build,让Cabal重新解析兼容的依赖组合
3. 用Stack替代Cabal构建项目
Stack会自动管理GHC版本和依赖快照,从根源上避免这类版本冲突:
- 如果还没初始化Stack环境,先执行:
stack init - 直接构建项目即可:
stack build
Stack会自动下载适配项目依赖的GHC版本,完全不用手动切换环境。
4. 用Cabal沙箱做环境隔离
虽然Cabal新构建系统(new-build)已经默认做隔离,但你可以试试传统沙箱方案:
cabal sandbox init cabal install --only-dependencies cabal build
沙箱会把依赖安装在项目本地,不会和全局环境冲突,但还是要确保GHC版本能匹配base的要求。
你遇到的错误信息:
无法解析依赖项:
[__0] 尝试: MM-0.1.0.0(用户目标)
[__1] 下一个目标: base(MM的依赖项)
[__1] 拒绝: base-4.12.0.0/installed-4.1...(冲突: MM => base>=4.9 && <4.10)
[__1] 失败(回溯,冲突集合: MM, base)
在彻底搜索剩余依赖树后,最难满足的目标是: MM, base
尝试继续配置。
配置MM-0.1.0.0...
cabal: 遇到缺失的依赖项: base ==4.9., cassava ==0.5., containers ==0.5., time ==1.6.
内容的提问来源于stack exchange,提问作者jonathancuento

