cabal编译Elm编译器源码时遇到依赖缺失与版本冲突问题
编译本地Elm编译器的依赖问题解决方案
你的问题核心来源于三个方面:
- 所用的cabal-install 1.24版本过旧,依赖求解能力不足,无法处理现代Haskell项目的版本约束逻辑
- Elm 0.19.1的依赖约束和当前系统预装的库(比如unix包绑定的time-1.8.0.2)存在版本冲突,旧版cabal无法自动隔离环境解决冲突
- 直接执行
cabal install elm会拉取Hackage上老旧的Elm 0.13版本,和你要编译的Github上的0.19.1版本不匹配
解决步骤
1. 升级cabal-install到最新稳定版
旧版本cabal的依赖求解器存在大量已知缺陷,首先升级工具链:
- 先卸载系统自带的旧版cabal-install,通过官方Haskell工具链安装程序部署最新稳定版cabal(3.0+),安装完成后重启终端,执行
cabal update更新包索引
2. 为Elm编译创建隔离环境
不要使用全局环境编译,避免和已安装的全局Elm、系统库冲突:
- 进入你克隆的Elm编译器源码目录
- 新版cabal默认使用本地隔离环境,无需额外配置,如果你暂时无法升级cabal,可执行以下命令创建本地沙箱:
cabal v2-sandbox init - 手动添加依赖版本约束,解决time包冲突:在源码目录下新建
cabal.project.local文件,写入以下内容:
该配置允许相关包使用高于声明版本的time库,跳过和unix包的版本冲突constraints: time >=1.8, unix >=2.7.2.2 allow-newer: elm:time, zip-archive:time, snap-server:time, snap-core:time, io-streams:time, http-client:time, directory:time, cookie:time, HTTP:time
3. 执行编译安装
- 先安装所有依赖:
cabal v2-install --only-dependencies - 编译Elm编译器:
cabal v2-build - 编译完成后,将生成的二进制文件复制到你本地PATH路径即可,或者直接执行
cabal v2-install安装到用户目录的bin文件夹下
备选方案
如果cabal配置依然有问题,可以使用Stack工具编译,Elm官方源码已经提供了配套的stack.yaml配置,会自动匹配正确的GHC和依赖版本,安装Stack后进入源码目录,直接执行stack build即可完成编译,编译完成后用stack install安装二进制文件。
内容的提问来源于stack exchange,提问作者john mangual
相关产品推荐
相关产品推荐

