我如何找出为什么cabal选择旧版本的库?

时间:2015-04-04 07:54:04

标签: haskell cabal cabal-install

假设我在全新安装的GHC中运行cabal install A B C D ... --dry-run(我刚刚更新了新版本)。我看到它想要引入的一些依赖项不是这些软件包的最新版本,例如:

utf8-string-0.3.8 (latest: 1)
cairo-0.12.5.3 (latest: 0.13.1.0)
glib-0.12.5.4 (latest: 0.13.1.0)
gio-0.12.5.3 (latest: 0.13.1.0)
pango-0.12.5.3 (latest: 0.13.1.0)
gtk-0.12.5.7 (latest: 0.13.6)

现在,这通常是完全正常的(特别是在最新版本的GHC发布后)。我不关心这里列出的特定包。但是当我看到这个时,我想快速检查为什么cabal无法使用这些软件包的最新版本。通常这意味着我要求安装的东西之一尚未更新,仍然依赖于旧版本,有时我实际上并不需要安装它,而是宁愿不拖动其他软件包的版本。

有时这些“不是最新版本”非常旧,这通常意味着我要求的东西与最近的东西完全不兼容,但是已经找到了使用具有非常宽松约束的古代版本的解决方案

我想要做的是找出我正在安装的软件包导致了这个问题。通常我会看到类似“哦,这些是一堆图形软件包,它可能是xmonad或者taffybar就是这个原因”,我会检查最新版本的xmonad和taffybar on hackage,看看它们对这些软件包的限制是什么。但通常这样的“明显罪魁祸首”实际上并没有对这些依赖关系的相关限制,这意味着问题是其他一些包依赖于我所要求的而且依赖于我没有得到最新版本的软件包,其中那个软件包与最新版本的软件包cabal不兼容。找到这样的包(以及为什么我真正关心它取决于它)可能是一个棘手的任务!

是否有任何工具或技巧可以帮助回答这个问题?我知道http://packdeps.haskellers.com/的依赖工具,这很有用,但似乎并没有完全符合我的要求;我可以使用反向依赖列表从cabal想要过期版本的软件包开始,然后继续工作直到找到我认识到的东西,或者我可以一次查询依赖监视器中的各个软件包并向后工作直到我找到一个不是最新的包。但似乎我要问的问题应该是更直接的回答。

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用-v3运行cabal。这将为您提供大量的调试输出,但它也会向您展示求解器探索的死胡同。

如果您只对一些软件包感兴趣,那么另一种可能性是添加--constraint='thePackage >= 1.2.3',其中1.2.3是您希望该软件包具有的最低版本。鉴于此,cabal将生成一个错误,解释为什么这个约束不可满足。