Jak mogę odinstalować wersję pakietu Cabal?

82

Happstack Lite psuje mi się, ponieważ dostaje blaze-html w wersji 0.5 i chce wersji 0.4. Cabal mówi, że zainstalowane są obie wersje 0.4.3.4 i 0.5.0.0. Chcę usunąć 0.5.0.0 i używać tylko starszej wersji. Ale Cabal nie ma polecenia „odinstalowania”, a kiedy próbuję ghc-pkg unregister --force blaze-html, ghc-pkgmówi , że moje polecenie zostało zignorowane.

Co ja robię?

UPDATE : Nie wierz w to . Chociaż ghc-pkgtwierdzi, że ignoruje polecenie, polecenie nie jest ignorowane. Dzięki zaakceptowanej odpowiedzi Dona Stewarta możesz usunąć dokładnie tę wersję, którą chcesz wyeliminować.

Norman Ramsey
źródło
2
ghc-pkg list blaze-html? Czy na pewno używasz go jako właściwy użytkownik? Może wyraźnie wskaż wersję, która ma zostać wyrejestrowana?
ivanm
1
@ivanm dzięki za pytanie. Okazało się, że mnie ghc-pkg okłamałeś !
Norman Ramsey
Coś w rodzaju duplikatu stackoverflow.com/questions/7252193/… , ale niechętnie go oznaczam, ponieważ ten jest lepszy :)
Ben Millwood
1
cabal-delete jest całkiem przyjemny do znajdowania i usuwania osieroconych pakietów.
Tobu
@Tobu A co cabal-uninstall z odpowiedzią poniżej ? Czy Cabal-Delete jest potężniejszy? Czy może działać z piaskownicą Cabal (będzie cabal exec -- cabal-deletedziałać poprawnie i usuwać pakiety z piaskownicy)? Dlaczego nie uczynić tego również odpowiedzią? Wygląda na fajne narzędzie.
imz - Ivan Zakharyaschev

Odpowiedzi:

95

Możesz ghc-pkg unregisterkonkretną wersję, na przykład:

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

To powinno wystarczyć.

Don Stewart
źródło
18
czy po wyrejestrowaniu są jakieś pliki leżące gdzieś, które należy przyciąć?
Erik Kaplun
Komentarze na temat innych miejsc wspominają, że ghc-pkg pozostawia foldery?
CMCDragonkai
zajrzyj do swojego ~/.cabal/folderu, aby znaleźć informacje o tym, gdzie znajdują się
paczki
23

Jeśli jesteś poza piaskownicą:

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

Jeśli jesteś w kabalowej piaskownicy :

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

Pierwszy --to separator argumentów dla hc-pkg. Działa to ghc-pkgw sposób świadomy piaskownicy.

musically_ut
źródło
20

Istnieje również pakiet cabal-uninstall , który zawiera cabal-uninstallpolecenie. Wyrejestrowuje pakiet i usuwa folder. Warto jednak wspomnieć, że przechodzi --forcedo, ghc-pkg unregisterwięc może zepsuć inne pakiety.

Davorak
źródło
1
cabal uninstallwyniki wcabal: unrecognised command: uninstall (try --help)
Steven Shaw
2
@StevenShaw - Link, który podałem, prowadzi do pakietu hakerskiego, który musisz zainstalować, aby go używać. Poleciłbym odpowiedź Dona, właśnie tego używam.
Davorak
A co z usunięciem cabal z komentarza powyżej @Tobu? Czy jest lepszy lub mocniejszy niż deinstalacja Cabal?
imz - Ivan Zakharyaschev
7

Oto skrypt powłoki, którego używam do odinstalowania pakietu. Obsługuje wiele zainstalowanych wersji GHC, a także usuwa odpowiednie pliki (ale jest dostarczany bez gwarancji, nie obwiniaj mnie, jeśli wykonasz instalację!)

#!/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
Ben Millwood
źródło
1
Właśnie wypróbowałem to na komputerze Mac i wydaje się, że nie działa.
pyrrhic