(在我开始之前:我将使用 Cabal 来获取其名称中包含Cabal并且与Haskell 有关的所有内容。)
有了平常的“你需要更新X来安装Y,但这会打破依赖性Z”问题前几天,我想我只是问:为什么Cabal没有被设计成一个完整的包经理,特别是具有以下特点:
您会看到此列表的位置。现在,对我来说,Cabal感觉就像是一个有点复杂的构建系统(当你想第一次开始使用它时,试着找出你的软件包所需的Base版本),这是一个半生不熟的软件包安装程序。
再次提出这个问题:为什么Cabal没有制作出功能齐全的构建/打包系统?我确信有一些设计决定导致当前状态。
(这个问题在某种程度上受到a rant on Reddit的启发,但与那个家伙相反并不意味着冒犯任何人。): - )
答案 0 :(得分:10)
安装相同软件包的多个版本现在非常有效(尝试cabal install ansi-terminal-0.5.4 && cabal install ansi-terminal-0.5.5
),但安装相同软件包版本的多个实例则不行。这是我们非常希望支持的,因为这将允许我们实现hermetic builds并解决“依赖地狱”问题,但这并非完全无足轻重。今年有一个GSoC项目为ghc-pkg和Cabal增加了对多个实例的支持,但补丁还没有在主线上。 Here's a video of the HIW 2012 talk about the project's results和here's the description of the internal design。
至于您的其他问题,实际上曾经有一个cabal upgrade
命令用于安装所有当前安装的软件包的最新版本,但它已被删除,因为它可能会破坏您的安装(同样,支持多个实例)相同的包版本将解决此问题)。卸载支持已暂时列在愿望清单上it's just that no-one had time to implement it yet。我想数字签名包和HTTPS也是如此。
此外,如果您有兴趣看到其中的一些功能已经实现,那么欢迎使用Cabal的补丁,随着转移到GitHub,您可以比以往更轻松地贡献代码(如果贡献现金也很好,如果你能负担得起 - 我认为Well-Typed非常乐意和你谈谈这件事。)
更新(2016年9月):有关当前事态的更新,请参阅Edward Z. Yang撰写的这篇文章:cabal new-build
is a package manager。