Cabal上传Haskell包失败:缺失依赖aeson <2.3
解决Hackage上传时aeson依赖版本不兼容问题
问题场景
我尝试上传首个Haskell包,操作流程如下:
$ git clone https://github.com/OrenGitHub/dhscanner.ast.git 2>/dev/null $ cd dhscanner.ast/ $ cabal --version cabal-install version 3.10.1.0 # <--- 版本足够新吧? compiled using version 3.10.1.0 of the Cabal library $ cabal update # <--- 确保最新 Downloading the latest package list from hackage.haskell.org Package list of hackage.haskell.org is up to date. The index-state is set to 2024-07-23T00:03:37Z.
本地执行cabal new-build和cabal install --force-reinstalls --lib均成功,也生成了sdist包,但执行上传命令:
cabal upload -d --publish -u ***** -p ********
时失败,报错:
Error: cabal: Encountered missing or private dependencies: aeson <2.3
本地cabal info aeson显示有多个可用版本但未安装,cabal haddock能正常生成文档。
解决步骤
1. 检查并调整.cabal文件的依赖约束
打开项目根目录下的.cabal文件,找到build-depends字段中对aeson的版本限制。如果写的是aeson <2.3,可能Hackage当前索引中该版本已无法被正常解析(比如被标记为过时或与其他核心包冲突)。
将约束放宽为兼容更高版本的范围,例如:
build-depends: ... aeson >=1.5 && <2.4, ...
具体版本范围可以根据你代码对aeson的实际兼容性调整,确保能匹配Hackage上现存的稳定版本。修改后重新生成sdist包:
cabal sdist
2. 指定本地一致的索引状态上传
如果需要保留原版本约束,可以强制Hackage使用你本地cabal update后的索引状态来解析依赖,避免因索引差异导致的依赖找不到问题:
cabal upload -d --publish --index-state='2024-07-23T00:03:37Z' -u <你的用户名> -p <你的密码>
这里的index-state值就是你本地cabal update输出里的时间戳。
3. 本地安装指定版本依赖后重新打包
先在本地安装符合约束的aeson版本,确保构建环境和依赖状态一致,再重新生成sdist包上传:
# 安装指定版本的aeson cabal install aeson-2.2.1.0 --lib # 清理旧构建文件 cabal clean # 重新构建项目 cabal new-build # 重新生成sdist包 cabal sdist # 再次尝试上传 cabal upload -d --publish -u <你的用户名> -p <你的密码>
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

