2012-01-10 3 views
5

При нахождении пакетов безумное поведение cabal. Например, бег«cabal install ___» разбивает ранее установленные пакеты

cabal install funsat 

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

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

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

+1

http://ivanmiljenovic.wordpress.com/2010/03/15/repeat-after-me-cabal-is-not-a-package-manager/ –

+0

@ MatveyB.Aksenov, что я с этой страницы было (a) cabal/= cabal-install, я уже знал, но не забочусь (б) используйте диспетчер системных пакетов (c), если у вас нет системных пакетов, переключитесь на gentoo. (c) на самом деле не вариант для меня, к сожалению. – gatoatigrado

ответ

8

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

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

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


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

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

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

+0

+1 Я не знал об этом, спасибо ... Я предполагаю, что это будет Haskell equiv виртуального виртуального Python. –

+0

отлично, хотя для zsh, удалите локальные (и добавьте напоминание о том, как установить в любом случае - http://pastebin.com/PGYWqdKA). он работает для примера funsat (остановка установки) и разрешает установку 'repa', которая ничего не сломала. так что спасибо!! – gatoatigrado

+0

также отлично знает о 'command', теперь я могу вытащить несколько хаков других функций оболочки. – gatoatigrado

5

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

2

Это известная проблема (см. this slide deck, начиная с слайда 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.