2015-04-04 3 views
4

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

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 отпущена). Меня не интересуют конкретные пакеты, перечисленные здесь. Но когда я вижу это, мне нравится быстро проверить, почему cabal не смог использовать самую последнюю версию этих пакетов. Часто это означает, что одна из вещей, которые я попросил установить, не обновлялась и по-прежнему зависит от старых версий, и иногда мне действительно не нужно ее устанавливать и, скорее, не придется перетаскивать версию других пакетов.

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

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

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

+0

Вы пытались добавить пакетную версию командной строки 'cabal install' и использовать' -v' и пытаться понять сообщения о том, почему решатель не смог найти план? –

+0

Я считаю, что вам нужно '-v3', чтобы увидеть полный вывод от решателя. Это то, что вы должны делать, когда вас интересует, почему cabal делает что-то странное или неправильное - работать с '-v3' и читать. – user2407038

ответ

1

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

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