Wie kann ich eine Version eines Cabal-Pakets deinstallieren?

82

Happstack Lite bricht an mir, weil es Blaze-HTML-Version 0.5 bekommt und Version 0.4 will. Cabal sagt , dass beide Versionen 0.4.3.4 und 0.5.0.0 installiert sind. Ich möchte die 0.5.0.0 entfernen und nur die ältere Version verwenden. Aber cabal hat keinen "Deinstallations" -Befehl, und wenn ich es versuche ghc-pkg unregister --force blaze-html, wird ghc-pkgmein Befehl ignoriert.

Was mache ich?

UPDATE : Glaub es nicht . Obwohl ghc-pkgbehauptet wird, den Befehl zu ignorieren, wird der Befehl nicht ignoriert. Und mit der akzeptierten Antwort von Don Stewart können Sie genau die Version entfernen, die Sie entfernen möchten.

Norman Ramsey
quelle
2
ghc-pkg list blaze-html? Sind Sie sicher, dass Sie es als der richtige Benutzer ausführen? Geben Sie möglicherweise explizit an, welche Version nicht registriert werden soll.
ivanm
1
@ivanm danke fürs fragen. Es stellt sich heraus , mich ghc-pkg angelogen zu haben!
Norman Ramsey
Eine Art Duplikat von stackoverflow.com/questions/7252193/… , aber ich zögere es, es zu kennzeichnen , weil dies besser ist :)
Ben Millwood
1
cabal-delete ist sehr gut geeignet, um verwaiste Pakete zu finden und zu entfernen.
Tobu
@Tobu Was ist mit cabal-uninstall in der Antwort unten erwähnt ? Ist Cabal-Delete mächtiger? Kann es mit einer Kabalen-Sandbox cabal exec -- cabal-deletefunktionieren ( funktioniert ordnungsgemäß und löscht Pakete aus der Sandbox)? Warum nicht auch eine Antwort geben? Es sieht aus wie ein schönes Werkzeug.
imz - Ivan Zakharyaschev

Antworten:

95

Sie können ghc-pkg unregistereine bestimmte Version wie folgt:

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

Das sollte ausreichen.

Don Stewart
quelle
17
Liegen nach der Registrierung Dateien irgendwo herum, die beschnitten werden sollten?
Erik Kaplun
Kommentare an anderen Stellen erwähnen, dass ghc-pkg Ordner herumlässt?
CMCDragonkai
Schauen Sie in Ihrem ~/.cabal/Ordner nach Informationen darüber, wo sich Pakete und Binärdateien befinden
Leahcim
23

Wenn Sie sich außerhalb eines Sandkastens befinden:

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

Wenn Sie sich in einem Kabalen-Sandkasten befinden :

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

Das erste --ist das Argumenttrennzeichen für hc-pkg. Dies läuft ghc-pkgsandboxbewusst ab.

musikalisch_ut
quelle
20

Es gibt auch das Paket cabal-uninstall , das einen cabal-uninstallBefehl bereitstellt . Es hebt die Registrierung des Pakets auf und löscht den Ordner. Es ist jedoch erwähnenswert, dass es an übergeben wird --force, ghc-pkg unregisterdamit andere Pakete beschädigt werden können.

Davorak
quelle
1
cabal uninstallErgebnisse incabal: unrecognised command: uninstall (try --help)
Steven Shaw
2
@StevenShaw - Der von mir bereitgestellte Link führt zu einem Hackage-Paket, das Sie installieren müssen, um es verwenden zu können. Ich würde Dons Antwort empfehlen, das ist was ich benutze.
Davorak
Was ist mit cabal-delete aus einem Kommentar von @Tobu? Ist es besser oder leistungsfähiger als die Deinstallation von Kabalen?
imz - Ivan Zakharyaschev
6

Hier ist ein Shell-Skript, mit dem ich ein Paket deinstalliere. Es unterstützt mehrere installierte Versionen von GHC und löscht auch relevante Dateien (wird jedoch ohne Garantie bereitgestellt, beschuldigen Sie mich nicht, wenn Sie Ihre Installation abspritzen!).

#!/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
quelle
1
Ich habe es gerade auf dem Mac versucht und es scheint nicht zu funktionieren.
Pyrrhose