¿Cómo puedo desinstalar una versión de un paquete Cabal?

82

Happstack Lite se me está rompiendo porque está recibiendo la versión 0.5 de blaze-html y quiere la versión 0.4. Cabal dice que están instaladas ambas versiones 0.4.3.4 y 0.5.0.0. Quiero eliminar 0.5.0.0 y usar solo la versión anterior. Pero Cabal no tiene un comando de "desinstalación", y cuando lo intento ghc-pkg unregister --force blaze-html, ghc-pkgdice que mi comando ha sido ignorado.

¿Qué debo hacer?

ACTUALIZACIÓN : No lo crea . Aunque ghc-pkgafirma ignorar el comando, el comando no se ignora. Y con la respuesta aceptada de Don Stewart, puede eliminar exactamente la versión que desea eliminar.

Norman Ramsey
fuente
2
ghc-pkg list blaze-html? ¿Está seguro de que lo está ejecutando como el usuario correcto? ¿Quizás indicar explícitamente la versión que no se registrará?
ivanm
1
@ivanm gracias por preguntar. ¡Resulta que me ghc-pkg mintió !
Norman Ramsey
Es una especie de duplicado de stackoverflow.com/questions/7252193/… , pero soy reacio a marcarlo porque este es mejor :)
Ben Millwood
1
cabal-delete es bastante bueno para encontrar y eliminar paquetes huérfanos.
Tobu
@Tobu ¿Qué hay de lo cabal-uninstall mencionado en la respuesta a continuación ? ¿Cabal-delete es más poderoso? ¿Puede funcionar con una caja de arena de cabal ( cabal exec -- cabal-deletefuncionará correctamente y eliminará paquetes de la caja de arena)? ¿Por qué no hacer de esto una respuesta también? Parece una buena herramienta.
imz - Ivan Zakharyaschev

Respuestas:

95

Puede ghc-pkg unregisteruna versión específica, así:

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

Eso debería ser suficiente.

Don Stewart
fuente
18
una vez sin registrar, ¿hay algún archivo por ahí que deba podarse?
Erik Kaplun
Los comentarios en otros lugares mencionan que ghc-pkg deja carpetas alrededor.
CMCDragonkai
eche un vistazo en su ~/.cabal/carpeta para obtener información sobre dónde están los pkgs y los binarios
Leahcim
23

Si está fuera de una caja de arena:

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

Si estás dentro de una caja de arena de cabal :

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

El primero --es el separador de argumentos para hc-pkg. Esto se ejecuta ghc-pkgde manera consciente de la zona de pruebas.

musicalmente_ut
fuente
20

También existe el paquete cabal-uninstall que proporciona un cabal-uninstallcomando. Anula el registro del paquete y elimina la carpeta. Sin embargo, vale la pena mencionar que pasa --forcea ghc-pkg unregisterpoder romper otros paquetes.

Davorak
fuente
1
cabal uninstallresultados encabal: unrecognised command: uninstall (try --help)
Steven Shaw
2
@StevenShaw: el enlace que proporcioné va a un paquete de piratería que debe instalar para poder usarlo. Recomendaría la respuesta de Don, eso es lo que uso.
Davorak
¿Qué pasa con cabal-delete de un comentario anterior de @Tobu? ¿Es mejor o más poderoso que la desinstalación de cabal?
imz - Ivan Zakharyaschev
7

Aquí hay un script de shell que uso para desinstalar un paquete. Es compatible con múltiples versiones instaladas de GHC y también borra los archivos relevantes (pero se proporciona sin garantía, ¡no me culpes si mandas tu instalación!)

#!/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
fuente
1
Intenté esto en Mac y no parece funcionar.
pírrica