如何解决 cabal 中损坏的依赖关系?

Posted

技术标签:

【中文标题】如何解决 cabal 中损坏的依赖关系?【英文标题】:How to resolve broken dependencies in cabal? 【发布时间】:2016-10-02 02:30:59 【问题描述】:

我是 Haskell 的初学者,我一直在愉快地使用 cabal 来安装我认为可能需要的所有东西,假设它可以像 port 或 homebrew 一样工作,为我解决所有依赖项并保持最新状态所以它们不会损坏等。但是,现在在尝试安装 lenses 库时,我收到以下消息:

In order, the following would be installed:
base-orphans-0.5.4 (new package)
distributive-0.5.0.2 (new version)
comonad-5 (new version)
bifunctors-5.4.1 (new package)
mtl-2.2.1 (reinstall) changes: transformers-0.5.2.0 -> 0.4.3.0
exceptions-0.8.3 (new package)
prelude-extras-0.4.0.3 (new package)
profunctors-5.2 (new package)
reflection-2.1.2 (new package)
semigroupoids-5.1 (new package)
free-4.12.4 (new package)
adjunctions-4.3 (new package)
kan-extensions-5.0.1 (new package)
lens-4.14 (new package)
cabal: The following packages are likely to be broken by the reinstalls:
parsec-3.1.11
network-uri-2.6.1.0
hackage-security-0.5.2.2
HTTP-4000.3.3
Use --force-reinstalls if you want to install anyway.

嗯,破坏 HTTP 和所谓的“安全性”听起来不是一个好主意,而且我的代码依赖于 Parsec。解决这种情况的正确方法是什么?我应该使用--force-reinstalls 并期望事情不会真正崩溃吗?或者让这些包损坏然后重新安装它们,假设如果 HTTP 包损坏是可能的?还是我必须自己选择安装或不安装哪些包,知道有些包会相互冲突?

问题的一部分可能是我最初没有意识到 hackage 上的一些包并不是真正的生产质量代码,所以我确实有很多我并不真正需要的依赖项。也许解决方案是卸载这些包及其依赖项。但是cabal --help 没有显示任何类型的卸载命令,所以我有点不知所措。

【问题讨论】:

我发现如果我输入 cabal install parsec lens 然后它会报告它只会破坏我不使用的东西(不包括 HTTP 和“安全”等可怕的东西),所以我要暂时这样。但是,我仍然希望了解解决此类问题的正确/预期方式,因为我相信它会在未来再次出现。 如果您可以接受降级transformers-0.5.2.0 -> 0.4.3.0,请重建并重新安装损坏的软件包。为了更好的生活,试试stack。 @Nathaniel 您使用的是什么版本的 Cabal?如果您还没有,请尝试更新到最新的 1.24 版本。此外,使用 Cabal 沙箱是一个好主意,方法是在项目文件夹中运行 cabal sandbox init,然后才运行 Cabal 安装。 【参考方案1】:

标准技术是告诉 cabal 您不介意重新安装会损坏的软件包。你可以用类似的东西来做到这一点

cabal install lenses parsec-3.1.11 network-uri-2.6.1.0 hackage-security-0.5.2.2 HTTP-4000.3.3

this fine introduction to cabal packages 上有更多关于这里发生的事情的详细信息,尤其是标有“The Pigeon Drop Con”的部分。

【讨论】:

以上是关于如何解决 cabal 中损坏的依赖关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何编译依赖项以在 cabal 沙箱中进行分析

如何在 .cabal 中指定对外部 C 库的依赖?

如何解决多模块项目中模块之间的依赖关系?

如何更好地解决工厂创建的对象中的依赖关系?

如何在命令行中使用带有 gradle 的袜子来解决依赖关系?

*我在项目构建中遇到了这种类型的错误,如何解决?*