如何用Cabal实现类似stack ls dependencies的依赖列表功能?
如何用Cabal获取与
stack ls dependencies一致的依赖列表(含传递依赖) 之前用stack ls dependencies能列出项目所有依赖(包括传递依赖,比如OneTuple),切换到Cabal后试了一堆命令都得不到相同结果?问题出在你用的命令都没命中「项目构建所需的完整依赖树」这个点,下面是正确的解决方法:
为什么之前的命令不对
cabal list ...:这是查询Hackage索引里的包,不是当前项目的依赖,所以会返回上万条结果,还找不到你本地的OneTuplecabal exec ghc-pkg list ...:只能看到当前环境已安装的包,而Cabal构建时会为项目单独管理依赖(比如dist-newstyle里的本地包数据库),很多传递依赖可能只在构建计划里,没全局安装,所以数量少很多cabal install --dry-run ...:模拟安装的输出太零散,不是结构化的完整依赖列表
正确的Cabal命令
Cabal 3.6+版本提供了plan子命令,专门用来查看项目的构建计划,能完整列出所有直接+传递依赖:
- 先确保生成了构建计划(如果还没配置过项目):
cabal configure
- 查看所有依赖的扁平化列表(和
stack ls dependencies输出格式接近):
cabal plan list
这个命令会输出所有构建计划里的包,包括传递依赖,数量应该和Stack列出的265个差不多,也能找到OneTuple。
- 如果需要更详细的信息(比如许可证),用:
cabal plan show
输出里每个包都会包含license字段,你可以用过滤命令提取,比如:
cabal plan show | grep -E 'name:|license:'
- 如果你只需要去重后的包名列表:
cabal plan list | awk '{print $1}' | sort | uniq
补充说明
Stack的createDependencyGraph本质是解析项目的依赖树,Cabal的plan子命令做的是同样的事——基于项目的.cabal文件和当前的包索引,生成完整的依赖解析结果,所以能得到和Stack一致的依赖范围。
内容的提问来源于stack exchange,提问作者RandomB
相关产品推荐
相关产品推荐

