«cabal install ___» ломает ранее установленные пакеты - PullRequest
5 голосов
/ 10 января 2012

Я нахожу поведение cabal при установке пакетов с ума. Например, работает

cabal install funsat

установлены старые версии array, time, random, quickcheck и bitset, с такими пакетами, как monadiccp, hoogle, heist, snap и т. Д.

Это работает, чтобы вернуться и cabal install monadiccp, и т. Д., Но как я могу избежать поведения по умолчанию, когда кабалы ломают установленные пакеты? Любой разумный менеджер пакетов Linux, такой как aptitude или zypper, будет спрашивать , хочу ли я ломать уже установленные пакеты при установке нового пакета.

Кто-нибудь готовил обходной сценарий? Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 10 января 2012

Я рекомендую cabal-dev , который поддерживает отдельный набор установленных пакетов для каждого проекта, над которым вы работаете.Это не решает плохое поведение установки cabal в целом, но означает, что такие сбои более изолированы, чем они могли бы быть, и позволяет вам легче их исправить, просто выполнив cabal-dev clean && cabal-dev install.

Дополнительное преимущество воспроизводимых сборок также приятно.

По общему признанию, это не обходной путь для вашей конкретной проблемы, но он уменьшает боль при установке кабала в целом.


Построение наОтвет Даниэля Фишера, вот оболочка для cabal, которая прерывает установку, если она переустанавливает пакет:

cabal () {
  if [ "$1" = "install" ]; then
    local out=$(command cabal --dry-run -v2 "$@" 2>&1)
    if echo "$out" | egrep -c '\((reinstall|new version)\)' >/dev/null; then
      echo "$out"
      return 1
    fi
  fi
  command cabal "$@"
}

YMMV;Я только слегка проверил это, и это вызывает досадную задержку при запуске, так как все зависимости должны быть рассчитаны дважды.Но это должно облегчить утомление, если вы хотите остаться в безопасности.

5 голосов
/ 10 января 2012

Обходной путь: всегда проверяйте сначала --dry-run. Если Cabal переустановит какой-либо пакет, будьте осторожны.

2 голосов
/ 10 января 2012

Это известная проблема (см. эту слайд-деку , начиная со слайда 22).Версия Darcs cabal-install (darcs get http://darcs.haskell.org/cabal) теперь показывает предупреждение, когда установка пакета сломает вашу систему.Пример:

$ cabal --version
cabal-install version 0.13.3
using version 1.13.3 of the Cabal library
$ cabal install monadiccp
[...]
$ cabal install funsat
Resolving dependencies...
In order, the following would be installed:
mtl-1.1.1.1 (new version)
syb-0.3.6 (new package)
array-0.2.0.0 (new version)
containers-0.2.0.1 (new version)
bimap-0.2.4 (new package)
deepseq-1.2.0.1 (reinstall) changes: array-0.3.0.2 -> 0.2.0.0
fgl-5.4.2.2 (new package)
text-0.11.1.12 (reinstall) changes: array-0.3.0.2 -> 0.2.0.0
parsec-3.1.2 (reinstall) changes: mtl-2.0.1.0 -> 1.1.1.1
parse-dimacs-1.2 (new package)
time-1.1.4 (new version)
random-1.0.0.3 (reinstall) changes: time-1.2.0.3 -> 1.1.4
QuickCheck-1.2.0.1 -base3 (new package)
bitset-0.6 (new package)
funsat-0.6.1 (new package)
cabal: The install plan contains reinstalls which can break your GHC
installation.
You can use the --avoid-reinstalls option to try to avoid this or try
to ghc-pkg unregister the version of the package version to see its effect
on reverse dependencies. If you know what you are doing you can use
the --override-reinstall-check option to override this reinstall check.
...