阴谋(依赖)地狱背后的原因是什么?

时间:2014-09-16 12:40:36

标签: haskell cabal

如何在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(我并不完全熟悉它,但它会有意义。)

3 个答案:

答案 0 :(得分:11)

你有这样的场景:

enter image description here

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

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

答案 1 :(得分:3)

问题在于您无法将程序与C语言的不同版本链接起来.A和B必须找到C的通用版本才能使用相同的某个函数实现。 这个问题的一个解决方案是OSGi,但需要像类加载器这样的东西,可以用来在相同的进程中加载​​不同版本的软件包C,而不会发生冲突。

答案 2 :(得分:0)

一种依赖地狱的方式是当你正在进行的几个不同的项目干扰时。虽然单个项目具有可解决的约束集,但两个不同的项目可能不会,并且由于它们共享单个包DB,因此会出现问题。这种依赖地狱的变种由cabal沙箱解决。