Почему кабал думает, что мне нужна старая библиотека?

#haskell #cabal #cabal-install

#haskell #cabal #cabal-install

Вопрос:

Просто чтобы я мог начать все сначала, я удалил package.conf.d at ~/.ghc/x86_64-linux-7.8.2 .

Когда я пытаюсь установить numeric-prelude , cabal пытается установить старую версию mtl , хотя я проверил все зависимости и mtl можно использовать самую новую.

Вот меньший пример, демонстрирующий (надеюсь) связанную проблему:

 $ cabal install QuickCheck parsec --dry-run
Resolving dependencies...
In order, the following would be installed (use -v for more details):
mtl-2.1.3.1 (latest: 2.2.1)
primitive-0.5.3.0
random-1.0.1.1
text-1.1.1.3
parsec-3.1.5
tf-random-0.5
QuickCheck-2.7.5
  

но установите либо самостоятельно:

 $ cabal install QuickCheck --dry-run
Resolving dependencies...
In order, the following would be installed (use -v for more details):
primitive-0.5.3.0
random-1.0.1.1
tf-random-0.5
QuickCheck-2.7.5

$ cabal install parsec --dry-run
Resolving dependencies...
In order, the following would be installed (use -v for more details):
text-1.1.1.3
transformers-0.4.1.0
mtl-2.2.1
parsec-3.1.5
  

и ни один из них не нужен mtl-2.1.3.1 !

Проблема аналогична numeric-prelude : я установил все перечисленные зависимости без проблем mtl-2.2 . Затем, когда я пытаюсь установить numeric-prelude , cabal пытается установить старую версию mtl .

Я предположил, что даже если бы я заблокировал свои пакеты cabal, удаление пользователя package.conf.d исправило бы это. Итак, мой cabal все еще заблокирован, или здесь происходит что-то еще?

Комментарии:

1. вы можете попробовать cabal install QuickCheck parsec --dry-run --constraint="mtl==2.2.1" ?

2. Вероятно, это сделано потому, что вы уже установили другой пакет, например, text и он построен против mtl 2.1.3.1 — чтобы избежать повторной установки текста, он повторно использует старую версию, против которой вы создали предыдущий пакет.

3. @ThomasM.DuBuisson Однако, как я уже упоминал, эта проблема сохраняется после удаления пользовательского package.conf.d файла, поэтому существующих пользовательских пакетов нет. Я предполагаю, что глобальные пакеты не зависят от mtl , поскольку я сам не устанавливал никаких глобальных пакетов…

4. Кроме того, это не объясняет, почему зависимости будут отличаться при установке двух пакетов вместе или по отдельности.

5. @bennofs Спасибо за совет. Когда я попробовал это, cabal захотел установить старую версию parsec , хотя последняя версия не имеет ограничений на mtl версию.

Ответ №1:

Я могу «исправить» это на своей машине, сказав:

 cabal install QuickCheck parsec --constraint="transformers == 0.4.*"
  

Проблема в этом случае заключается в том, что это QuickCheck зависит от transformers, и предпочтение отдается выбору версии, которую вы уже установили, а именно transformers-0.3.0.0 . Но этот выбор transformers теперь несовместим с выбором последней mtl версии. Теперь Cabal должен сделать выбор, какое из двух предпочтений нарушить (либо выбрать более позднюю версию transformers для сборки QuickCheck , либо выбрать более старую версию mtl ). Он случайным образом выбирает одну, и в данном случае это не та, которую вы хотите… Добавление дополнительного ограничения помогает.

Редактировать

Ибо numeric-prelude ситуация немного иная. Последняя версия numeric-prelude depends on storable-record , которая явно зависит от transformers < 0.4 . Но numeric-prelude также зависит от parsec , что зависит от mtl . Таким образом, вы просто не можете использовать его с последней mtl версией.

Комментарии:

1. Интересно, заключается ли основная проблема в том, что GHC-7.8.2 полагается на transformers-0.3.0.0 . Я попытался загрузить сборку nightly , чтобы посмотреть, исправлено ли это, но ссылка мертва.