haskell - cabal 说“重新安装可能会破坏以下软件包”是什么意思
问题描述
我在运行时看到此消息弹出几次,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 YC Lai 的Storage and Identification of Cabalized Packages(特别是,我在这里使用的示例本质上是对其推论的摘要:Pigeon Drop Con部分)。
虽然 Cabal 1 在其更高版本中能够在上述场景中检测到重新安装已更改,B
即使版本号保持不变(这使得保护措施成为可能),但它无法避开这两个变体的B-1.0
同时。另一方面,Cabal 3 能够做到这一点,从而消除了问题。
推荐阅读
- typescript - Inversify 实例未正确注入
- javascript - 如何在 Vue cli 中导入使用其他本地文件中的函数的 JavaScript 文件而不会出现未定义的错误?
- html - 响应式表格,在桌面上工作,但在移动设备上不完全相同
- php - 我可以在表格中填写数组吗
- python - 使用 Python Selenium 的 csvWriter 不会遍历 0 到 j - 它只接受最后一次点击而不是每次点击
- node.js - 带有端口的AWS公共IP不适用于nodejs
- xamarin - 由于链接器问题,Xamarin iOS 绑定库 (Swift) 构建错误
- python - 如何让客户端套接字继续在 python 中侦听服务器?
- python - Kivy 和 Python 如何在同一视频的两个 Videoplayer 上播放视频 定位到另一个
- html - 当我更改父元素的高度时图像变形