Как я могу удалить версию пакета Cabal?

82

Happstack Lite ломает меня, потому что он получает версию 0.5 blaze-html и ему нужна версия 0.4. Кабал говорит, что установлены обе версии 0.4.3.4 и 0.5.0.0. Я хочу удалить 0.5.0.0 и использовать только старую версию. Но у Кабала нет команды "удалить", и когда я пытаюсь ghc-pkg unregister --force blaze-html, ghc-pkgговорит , что моя команда проигнорирована.

Что мне делать?

ОБНОВЛЕНИЕ : не верьте . Хотя ghc-pkgутверждает, что игнорирует команду, команда не игнорируется. И с принятым ответом Дона Стюарта вы можете удалить именно ту версию, которую хотите удалить.

Норман Рэмси
источник
2
ghc-pkg list blaze-html? Вы уверены, что используете его как правильный пользователь? Может быть, прямо указать версию, которую нужно отменить?
ivanm
1
@ivanm спасибо за вопрос. Оказывается, ghc-pkg солгал мне!
Норман Рэмси
Вроде дубликат stackoverflow.com/questions/7252193/… , но я не хочу отмечать его, потому что он лучше :)
Бен Миллвуд,
1
cabal-delete очень удобен для поиска и удаления потерянных пакетов.
Tobu,
@Tobu О чем cabal-uninstall упомянуто в ответе ниже ? Кабала-удаление более действенна? Может ли он работать с песочницей Cabal (будет cabal exec -- cabal-deleteработать корректно и удалять пакеты из песочницы)? Почему бы не дать и этому ответу? Похоже, хороший инструмент.
imz - Иван Захарящев

Ответы:

95

Вы можете ghc-pkg unregisterконкретную версию, например:

$ ghc-pkg unregister --force regex-compat-0.95.1

Этого должно быть достаточно.

Дон Стюарт
источник
18
После отмены регистрации есть ли где-нибудь файлы, которые следует удалить?
Эрик Каплун
В комментариях к другим местам упоминается, что ghc-pkg оставляет папки вокруг?
CMCDragonkai
загляните в свою ~/.cabal/папку, чтобы узнать, где находятся pkgs и двоичные файлы
Leahcim 08
23

Если вы находитесь за пределами песочницы:

ghc-pkg unregister --force regex-compat-0.95.1

Если вы находитесь в песочнице Кабала :

cabal sandbox hc-pkg -- unregister attoparsec --force

Первый --- это разделитель аргументов для hc-pkg. Это работает ghc-pkgв режиме песочницы.

musically_ut
источник
20

Также существует пакет cabal-uninstall , который предоставляет cabal-uninstallкоманду. Он отменяет регистрацию пакета и удаляет папку. Тем не менее, стоит упомянуть, что он переходит --forceк нему, ghc-pkg unregisterпоэтому он может сломать другие пакеты.

Даворак
источник
1
cabal uninstallрезультатыcabal: unrecognised command: uninstall (try --help)
Стивен Шоу
2
@StevenShaw - Ссылка, которую я предоставил, ведет на пакет взлома, который вам нужно установить, чтобы использовать. Я бы порекомендовал ответ Дона, это то, что я использую.
Davorak
А как насчет cabal-delete из комментария @Tobu выше? Это лучше или мощнее, чем cabal-uninstall?
imz - Иван Захарящев
7

Вот сценарий оболочки, который я использую для удаления пакета. Он поддерживает несколько установленных версий GHC, а также стирает соответствующие файлы (но предоставляется без гарантии, не обвиняйте меня, если вы пропустите свою установку!)

#!/bin/bash -eu
# Usage: ./uninstall.sh [--force | --no-unregister] pkgname-version

# if you set VER in the environment to e.g. "-7.0.1" you can use
# the ghc-pkg associated with a different GHC version
: ${VER:=}

if [ "$#" -lt 1 ]
then
        echo "Usage: $0 [--force | --no-unregister] pkgname-version"
        exit 1
fi

if [ "$1" == "--force" ]
then force=--force; shift; # passed to ghc-pkg unregister
else force=
fi

if [ "$1" == "--no-unregister" ]
then shift # skip unregistering and just delete files
else
        if [ "$(ghc-pkg$VER latest $1)" != "$1" ]
        then
                # full version not specified: list options and exit
                ghc-pkg$VER list $1; exit 1
        fi
        ghc-pkg$VER unregister $force $1
fi

# wipe library files
rm -rfv -- ~/.cabal/lib/$1/ghc-$(ghc$VER --numeric-version)/

# if the directory is left empty, i.e. not on any other GHC version
if rmdir -- ~/.cabal/lib/$1 
then rm -rfv -- ~/.cabal/share/{,doc/}$1 # then wipe the shared files as well
fi
Бен Миллвуд
источник
1
Я только что попробовал это на Mac, и, похоже, это не работает.
pyrrhic