我已经看到在运行cabal v1-install
时弹出此消息几次,但建议还是使用--force-reinstalls
进行安装。因为我对Cabal不太了解,所以我不确定为什么软件包会由于重新安装而损坏。有人可以在此消息后面的背景信息中填写我吗?
致将来的读者注意:此讨论是关于历史问题的。出于实际目的,如果您使用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 Y. C. Lai的Storage and Identification of Cabalized Packages(特别是,我在此使用的示例本质上是其推论:鸽子投掷骗局的摘要)。
虽然Cabal 1在其更高版本中能够在上述情况下检测到重新安装已更改B
,即使版本号保持不变(这使得保护措施得以实现),却无法同时保持B-1.0
的两个变体。另一方面,Cabal 3可以做到这一点,从而消除了问题。