【问题标题】:What's the reason behind cabal (dependency) hell?阴谋集团(依赖)地狱背后的原因是什么?
【发布时间】:2014-09-16 12:40:36
【问题描述】:

Cabal-install 中的依赖地狱是如何发生的?

我在Cabal/Survival - HaskellWiki阅读了以下内容:

1。 Cabal-install 造成的困难是什么?

Cabal 的主要困难被称为“依赖地狱”,其中 cabal-install 无法为 或其他原因,导致大量的体力劳动。作为一个 这个困难的例子,考虑一个用户希望 安装包 A 和 B。这两个都适用于包 C,但不能 使用相同版本的 C。

我理解为什么这通常有意义,但不适用于 Cabal-install/ghc-pkg,因为您可以安装同一软件包的多个版本。
就好像每个版本都是一个完全不同的包,在许多方面,版本如何成为包名称的一部分(例如mustaches-0.1.0.0)——也许它真的适用于 ghc-pkg(我并不完全熟悉有它,但它会有意义)。

【问题讨论】:

  • \grumble{我不禁觉得 cabal 太慢了,容易出错,笨重而且烦人。我们是哈斯克尔!一定有更好的方法!当然,我们可以使用更像nix(纯粹是功能性的)但与 Haskell 平台一样便携的东西。更好的是,我可以在 hackage 上单击“下载”并且它会发生,而不会破坏任何东西。 }

标签: haskell cabal


【解决方案1】:

你有这样的场景:

其中 B 和 C 都依赖于 A。但是,如果它们安装在不同的时间,它们可能依赖于不同的 A 版本。例如,A 版本 1 导出 type T = Int,但在版本 2 中它导出 @987654323 @。

只有当您尝试构建 D 时,您才会暴露 B 和 C 是针对不同版本的 A 构建的问题,并且您无法将 T version 1T version 2 进行比较。

【讨论】:

    【解决方案2】:

    问题是你不能将你的程序链接到那些不同版本的包 C。A 和 B 必须找到 C 的通用版本才能使用某个函数的相同实现。 这个问题的一个解决方案是 OSGi,但需要像 Classloaders 这样的东西,它可以用来在同一个进程中加载​​不同版本的包 C 而不会发生冲突。

    【讨论】:

      【解决方案3】:

      发生依赖地狱的一种方式是当您正在从事的几个不同的项目相互干扰时。虽然单个项目具有可解决的约束集,但两个不同的项目可能没有,并且由于它们共享单个包数据库,因此会有麻烦。这种依赖地狱的变体由阴谋集团沙箱解决。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多