Как узнать, почему Кабал выбирает старую версию библиотеки?

Скажем, я запускаю cabal install A B C D ... --dry-run в новой установке GHC (я только что обновил новую версию). Я вижу, что некоторые из зависимостей, которые он хочет получить, не являются последними версиями этих пакетов, например:

utf8-string-0.3.8 (latest: 1)
cairo-0.12.5.3 (latest: 0.13.1.0)
glib-0.12.5.4 (latest: 0.13.1.0)
gio-0.12.5.3 (latest: 0.13.1.0)
pango-0.12.5.3 (latest: 0.13.1.0)
gtk-0.12.5.7 (latest: 0.13.6)

Теперь это часто совершенно нормально (особенно в последнее время после выпуска новой версии GHC). Меня не интересуют конкретные пакеты, перечисленные здесь. Но когда я вижу это, мне нравится быстро проверять, почему Кабал не смог использовать самую последнюю версию этих пакетов. Часто это означает, что одна из вещей, которые я просил установить, не была обновлена ​​и все еще зависит от старых версий, а иногда мне на самом деле не нужно ее устанавливать, и я бы предпочел, чтобы она не перетаскивала версии других пакетов.

Иногда эти «не самые последние версии» очень старые, что обычно означает, что то, о чем я прошу, полностью несовместимо с последними версиями, но было найдено решение с использованием старых версий с очень слабыми ограничениями.

Что я хотел бы сделать, так это выяснить, какой из пакетов, которые я устанавливаю, вызывает это. Обычно я вижу что-то вроде «о, это куча графических пакетов, вероятно, причина в xmonad или taffybar», и я иду проверять последнюю версию xmonad и taffybar на hackage, чтобы узнать, каковы их ограничения на эти пакеты. Но часто «очевидные виновники», подобные этому, на самом деле не имеют соответствующих ограничений на эти зависимости, а это означает, что проблема заключается в каком-то другом пакете, который зависит от того, о чем я просил, и также имеет зависимость от пакеты, последнюю версию которых я не получаю, где этот пакет несовместим с последней версией пакета, о котором сообщает клика. Найти такой пакет (и почему то, что меня действительно волнует, зависит от него) может быть непростой задачей!

Существуют ли какие-либо инструменты или приемы, которые могут помочь ответить на этот вопрос? Я знаю о полезных инструментах зависимости на http://packdeps.haskellers.com/, но, похоже, не делает именно то, что я хочу; Я могу использовать обратный список зависимостей, чтобы начать с пакетов, для которых Кабала хочет получить устаревшую версию, и двигаться вперед, пока не найду что-то знакомое, или я могу запрашивать отдельные пакеты в мониторе зависимостей по одному и работать в обратном направлении, пока не получу найти один из не последних пакетов. Но похоже, что вопрос, который я задаю, должен быть более прямым.


person Ben    schedule 04.04.2015    source источник
comment
Пробовали ли вы добавить нужную версию пакета в командную строку cabal install и использовать -v, пытаясь понять сообщения о том, почему решатель не смог найти план?   -  person Reid Barton    schedule 04.04.2015
comment
Я считаю, что вам нужно -v3, чтобы увидеть полный вывод решателя. Это то, что вы должны сделать, когда вас интересует, почему клика делает что-то странное или неправильное - запустите с -v3 и прочитайте.   -  person user2407038    schedule 05.04.2015


Ответы (1)


Один из способов сделать это — запустить кабалу с -v3. Это даст вам много результатов отладки, но также покажет вам тупики, которые исследовал решатель.

Если вас интересует только несколько пакетов, другой вариант — добавить --constraint='thePackage >= 1.2.3', где 1.2.3 — это минимальная версия, которую вы ожидаете от пакета. Учитывая это, клика выдаст ошибку, объясняющую, почему это ограничение невыполнимо.

person bennofs    schedule 05.04.2015