Примечание для будущих читателей: это обсуждение исторических вопросов. Для практических целей вы можете спокойно игнорировать все это, если используете Cabal 3.
Проблема связана с транзитивными зависимостями. Например, предположим, что у нас установлены следующие три пакета в указанных c версиях:
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. Лая * Хранение и идентификация кабализованных пакетов (в частности, пример, который я здесь использовал, по сути является кратким изложением его следствия: раздел Pigeon Drop Con ).
Хотя Cabal 1 в своих более поздних версиях смогла в описанном выше сценарии обнаружить, что переустановка изменила B
, даже несмотря на то, что номер версии остался прежним (что и сделало возможной защиту), он не мог одновременно использовать два варианта B-1.0
. Cabal 3, с другой стороны, может это сделать, что устраняет проблему.