#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 , чтобы посмотреть, исправлено ли это, но ссылка мертва.