首页 > 解决方案 > cabal 说“重新安装可能会破坏以下软件包”是什么意思

问题描述

我在运行时看到此消息弹出几次,cabal v1-install并建议无论如何都要使用--force-reinstalls安装。由于我对 cabal 了解不多,我不确定为什么一个包会因为重新安装而损坏。有人可以告诉我这条消息背后的背景吗?

标签: haskellcabal

解决方案


未来读者请注意:本次讨论是关于历史问题的。出于实际目的,如果您使用的是 Cabal 3,您可以放心地忽略所有这些。

这个问题与传递依赖有关。例如,假设我们在特定版本中安装了以下三个包:

  • A-1.0;
  • B-1.0, 这取决于A; 和
  • C-1.0,这取决于B,但不明确地取决于A

然后,我们将安装A-1.1,这似乎可以正常工作:

  • A-1.1会被安装,但A-1.0会保留旧版本,只是为了使用它构建的其他包;
  • B-1.0会继续使用A-1.0;和
  • C-1.0会继续使用B-1.0

但是,如果我们出于某种原因尝试重新安装B-1.0(而不是更新到B-1.1),将会有麻烦:

  • A-1.1并且A-1.0仍可用于其他需要它们的软件包;
  • B-1.0但是,将针对 进行重建A-1.1,没有办法保留相同版本的第二次安装B;和
  • C-1.0,它是针对被替换的B-1.0(取决于A-1.0)构建的,现在将被破坏。

v1-install为这种危险的重新安装提供了保障。使用--force-reinstalls会禁用该保护措施。

有关周围问题的详细说明,请参阅 Albert YC Lai 的Storage and Identification of Cabalized Packages(特别是,我在这里使用的示例本质上是对其推论的摘要:Pigeon Drop Con部分)。

虽然 Cabal 1 在其更高版本中能够在上述场景中检测到重新安装已更改,B即使版本号保持不变(这使得保护措施成为可能),但它无法避开这两个变体的B-1.0同时。另一方面,Cabal 3 能够做到这一点,从而消除了问题。


推荐阅读