13

(在开始之前:我将使用Cabal表示名称中包含 Cabal 并且与 Haskell 相关的所有内容。)

前几天又遇到了通常的“你需要更新 X 来安装 Y,但这会破坏依赖 Z”的问题,我想我只想问:为什么 Cabal 不是设计成一个完整的包管理器,尤其是以下特点:

  • 版本控制:将一个包的多个版本并排安装,让包选择所需的依赖项。如果未指定软件包版本,请使用可用的最新版本。
  • 更新软件包 - 或者更好的是,安装最新版本。
  • 删除
  • 检查包裹完整性

您会看到此列表的去向。现在,对我来说,Cabal 感觉像是一个有点复杂的构建系统(当你想第一次开始使用它时,试着找出你的包需要哪个版本的 Base),它带有一个半生不熟的包安装程序。

那么问题又来了:为什么 Cabal 没有制作一个功能齐全的构建/打包系统?我确信有一些设计决定导致了当前状态。

(这个问题在某种程度上受到Reddit 上的咆哮的启发,但与那个人相反,并不意味着通过上述内容冒犯任何人。):-)

4

1 回答 1

10

安装同一个包的多个版本现在效果很好(尝试cabal install ansi-terminal-0.5.4 && cabal install ansi-terminal-0.5.5),但安装同一个包版本的多个实例却不行。这是我们非常想支持的东西,因为这将使我们能够实现密封构建并解决“依赖地狱”问题,但这并非完全无关紧要。今年有一个 GSoC 项目为 ghc-pkg 和 Cabal 添加对多个实例的支持,但这些补丁还没有进入主线。这是 HIW 2012 谈论项目成果的视频这里是内部设计的描述

至于您的其他问题,实际上曾经有一个cabal upgrade命令用于安装所有当前安装的软件包的最新版本,但它被删除了,因为它可能会破坏您的安装(同样,支持同一软件包版本的多个实例可以解决这个问题)。卸载支持已经在愿望清单上一段时间了,只是还没有人有时间实现它。我猜数字签名包和 HTTPS 也是如此。

此外,如果你有兴趣看到其中一些功能的实现,Cabal 的补丁总是受欢迎的,并且随着迁移到GitHub,贡献代码变得比以往任何时候都更容易(如果你能负担得起,贡献现金也可以 - 我认为Well-Typed将非常乐意与您讨论此问题)。

更新(2016 年 9 月):有关当前事务状态的更新,请参阅 Edward Z. Yang 的这篇文章:cabal new-build是一个包管理器

于 2012-10-30T01:04:13.167 回答