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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:12:48