我如何找出 cabal 选择旧版本库的原因?

Ben*_*Ben 5 haskell cabal cabal-install

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

我想要做的是找出我正在安装的哪些软件包导致了这种情况。通常我可以看到类似“哦,那些是一堆图形包,可能是 xmonad 或 taffybar 的原因”之类的内容,然后我会在 hackage 上查看最新版本的 xmonad 和 taffybar,看看它们对这些包的限制是什么。但是通常像这样的“明显的罪魁祸首”实际上对这些依赖项没有相关的约束,这意味着问题是其他一些包,它依赖于我要求的东西,并且依赖于我不是的包获取最新版本的,在包与 cabal 报告的包的最新版本不兼容。找到这样一个包(以及为什么我真正关心的是依赖于它)可能是一项棘手的任务!

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

ben*_*ofs 2

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

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