Почему cabal устанавливает переустановку пакетов уже в .cabal/lib - программирование
Подтвердить что ты не робот

Почему cabal устанавливает переустановку пакетов уже в .cabal/lib

Я пытаюсь использовать CircleCI для создания некоторых проектов Haskell. Circle автоматически кэширует каталог /home/ubuntu/.cabal после каждой сборки, и я думал, что это ускорит сборки, но они, похоже, занимают столько же времени, как и раньше --- все, что пропустили, это шаг загрузки.

Инструкции по сборке, которые я использую,

cabal update
cabal install --only-dependencies --enable-tests
cabal configure --enable-tests
cabal build
cabal test

и я ожидал, что шаг install --only-dependencies будет видеть кеш и работать быстрее.

Что может быть не так?

4b9b3361

Ответ 1

Несколько месяцев назад была отличная дискуссия по Reddit. Мое воспоминание состоит в том, что Haskell не имеет заданного двоичного интерфейса приложения и что компилятор ghc делает много агрессивных сокращений межбиблиотечного графа во время компиляции. В результате в приложении Haskell нет такой вещи, как установка стабильной библиотеки. Любая библиотека может быть перетащена и перекомпилирована по всему набору уже установленных библиотек.

Суть в том, что кеширование каталога .cabal/lib ничего не делает для ускорения установки. Перекомпиляция зависимостей всегда будет происходить. Ваш лучший подход, помимо песочницы с использованием hsenv, заключается в том, чтобы указать полный набор зависимых библиотек при вызове cabal install. Таким образом, зависимости можно вычислить заблаговременно, а компиляция должна выполняться только один раз.

Гуру Хаскелла, пожалуйста, не стесняйтесь исправить меня, если что-то, что я сказал здесь, ошибочно. Я уже несколько месяцев из цикла Haskell, и я знаю, что в последнее время проблемы с каббалом/библиотекой получили много внимания.