Desinstalar / eliminar un paquete Homebrew que incluya todas sus dependencias

339

Tengo una fórmula de Homebrew que deseo desinstalar / eliminar junto con todas sus dependencias, omitiendo paquetes de los que dependen otros paquetes (también conocido como eliminación de paquetes en cascada en el lenguaje del administrador de paquetes).

por ejemplo, desinstalar el paquete aque depende de los paquetes by c, donde el paquete dtambién depende del paquete c. El resultado debería desinstalar ambos a& b, omitiendo c.

¿Cómo puedo hacer eso?

Debe haber una manera de desinstalar un paquete sin dejar basura innecesaria .

Ory Band
fuente
3
¿No es esto lo que cualquier administrador de paquetes, digno de este nombre, debería hacer de forma inmediata? LOL
mljrg

Respuestas:

407

EDITAR:

Parece que el problema ahora se resuelve usando un comando externo llamado brew rmdepsobrew rmtree .

Para instalar y usar, emita los siguientes comandos:

$ brew tap beeftornado/rmtree
$ brew rmtree <package>

Vea el enlace de arriba para más información y discusión.


Respuesta original:

Parece que actualmente, no hay una manera fácil de lograr esto.

Sin embargo, presenté un problema en la página de GitHub de Homebrew , y alguien sugirió una solución temporal hasta que agreguen un comando exclusivo para resolver esto.

Hay un comando externo llamado brew leavesque imprime todos los paquetes que no son dependencias de otros paquetes.

Si hace una lógica y en la salida de brew leavesy brew deps <package>, puede obtener una lista de los paquetes de dependencia huérfanos, que puede desinstalar manualmente después. Combina esto con xargsy obtendrás lo que necesitas, supongo (no probado, no cuentes con esto).


EDITAR: Alguien sugirió una solución muy similar, usando en joinlugar de xargs:

brew rm FORMULA
brew rm $(join <(brew leaves) <(brew deps FORMULA))

Consulte el comentario sobre el problema mencionado anteriormente para obtener más información.

Ory Band
fuente
44
Segunda línea da un error: This command requires a keg argument.
Shmidt
77
El brew rmtreescript de terceros ahora está disponible en un toque:brew tap beeftornado/rmtree && brew install beeftornado/rmtree/brew-rmtree
Nick McCurdy
1
@NicolasMcCurdy Lo he intentado y puedo confirmar que esta es realmente la forma más convincente hoy en día.
Ory Band
1
brew rm $(join <(brew leaves) <(brew deps FORMULA))hace bien el trabajo. Solo tiene que ejecutarlo una y otra vez hasta que se eliminen todas las dependencias. No puede desinstalar todo de una vez porque las dependencias son interdependientes entre sí.
Greg Wang
1
El && brew install brew-rmtreeya no es necesario.
Boris
34

El objetivo aquí es eliminar el paquete dado y sus dependencias sin romper las dependencias de otro paquete. Yo uso este comando:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | xargs brew install

Nota: Editado para reflejar el útil comentario de @ alphadogg.

jfmercer
fuente
Tuve que agregar --ignore-dependenciespara eliminar para permitir que esto funcione.
alphadogg
2
Esto rompió mi configuración de preparación, ya que no reinstaló los departamentos que se usan en otros paquetes. NO USAR
Marco Pappalardo
26

brew rmtree no funciona en absoluto . De los enlaces sobre ese tema encontré rmrec que realmente funciona. Dios sabe por qué brewno tiene esto como un comando nativo.

brew tap ggpeti/rmrec
brew rmrec pkgname
Timmmm
fuente
ME ENCANTA esto, aunque si ya ha comenzado a desinstalarse y sigue buscando más paquetes que necesita eliminar, aún necesita saber cuáles son los paquetes más conmovedores, o simplemente puede reinstalar brevemente [FORMULA]y luego usar rmrec para eliminar recursivamente todas sus dependencias correctamente.
dragon788
2
Advertencia: También parece rmrecque actualmente no maneja muy bien los paquetes de espacios de nombres. Estaba usando algo que se detuvo linuxbrew/xorg/xorgy eliminó todo excepto ese paquete e incluso nombrando explícitamente ese paquete no pudo resolverlo y no hizo nada.
dragon788
Confirmó que la recomendación de usar rmreces mala. No maneja dependencias en absoluto.
omdv
Quieres decir rmtree? rmrecmaneja dependencias.
Timmmm
1
God knows why brew doesn't have this as a native command.=> Porque los desarrolladores de cerveza tienen malas actitudes. Ni siquiera permiten que las personas abran ningún problema. Visite github.com/Homebrew/brew , ahora solo tiene menos de 20 problemas. Un número tan pequeño. ¿Eso es algo bueno? No, es muy malo.
sgon00
15

Basado en la respuesta de @jfmercer (las correcciones necesitaban más que un comentario).

Eliminar las dependencias del paquete (no elimina el paquete):

brew deps [FORMULA] | xargs brew remove --ignore-dependencies

Eliminar paquete:

brew remove [FORMULA]

Vuelva a instalar las bibliotecas faltantes:

brew missing | cut -d: -f2 | sort | uniq | xargs brew install

Desinstalación probada melddespués de descubrir las versiones MeldMerge .

bóveda
fuente
Había instalado ffmpeg con brew, lo que estropeó mucho las cosas. Limpiar ffmpeg, incluida su lista extendida de dependencias, con el método descrito anteriormente, funcionó para mí.
webtweakers
13

El uso de esta respuesta requiere que cree y mantenga un archivo que contenga los nombres de paquete que desea instalar en su sistema. Si aún no tiene uno, use el siguiente comando y elimine los nombres de paquetes que no desea mantener instalados.

brew leaves > brew_packages

Luego puede eliminar todos los paquetes instalados, pero no deseados y cualquier dependencia innecesaria ejecutando el siguiente comando

brew_clean brew_packages

brew_cleanestá disponible aquí: https://gist.github.com/cskeeters/10ff1295bca93808213d

Este script obtiene todos los paquetes que especificó en brew_packages y todas sus dependencias y los compara con la salida brew listy finalmente elimina los paquetes no deseados después de verificar esta lista con el usuario.

En este punto, si desea eliminar el paquete a, simplemente elimínelo del archivo brew_packages y luego vuelva a ejecutarlo brew_clean brew_packages. Se eliminará b, pero no c.

Chad Skeeters
fuente
Creo que Brew Clean está incorporado ahora, inténtalobrew clean -s
Devin G Rhode
1
El comentario anterior fue incorrecto, la edición se corta a los 5 minutos. probarbrew cleanup -s && brew cask cleanup
Devin G Rhode
5

Solo puede usar una tubería UNIX para esto

brew deps [FORMULA] | xargs brew rm
moldeado
fuente
12
Esta no es una buena solución. Puede romper las dependencias de otros paquetes de esta manera.
Ory Band
12
Hay un comando que puedes ejecutar después para decirte si agregaste cualquier otra dependencia requerida brew missingque te dirá qué comando necesitas ejecutar para recuperarlos
SeanJA
4

Guarde el siguiente script como brew-purge

#!/bin/bash
#:Usage: brew purge formula
#: 
#:Removes the package and all dependancies.
#: 
#: 
PKG="$1"
if [ -z "$PKG" ];then
   brew purge --help
   exit 1
fi
brew rm $PKG
[ $? -ne 0 ] && exit 1
while brew rm $(join <(brew leaves) <(brew deps $PKG)) 2>/dev/null
  do :
done
echo Package $PKG and its dependancies have been removed.
exit 0

Ahora instálalo con el siguiente comando

sudo install brew-purge /usr/local/bin

Ahora ejecútalo

brew purge package

Ejemplo usando gpg

$ brew purge gpg
Uninstalling /usr/local/Cellar/gnupg/2.2.13... (134 files, 11.0MB)
Uninstalling /usr/local/Cellar/adns/1.5.1... (14 files, 597.5KB)
Uninstalling /usr/local/Cellar/gnutls/3.6.6... (1,200 files, 8.9MB)
Uninstalling /usr/local/Cellar/libgcrypt/1.8.4... (21 files, 2.6MB)
Uninstalling /usr/local/Cellar/libksba/1.3.5... (14 files, 344.2KB)
Uninstalling /usr/local/Cellar/libusb/1.0.22... (29 files, 508KB)
Uninstalling /usr/local/Cellar/npth/1.6... (11 files, 71.7KB)
Uninstalling /usr/local/Cellar/pinentry/1.1.0_1... (12 files, 263.9KB)
Uninstalling /usr/local/Cellar/libassuan/2.5.3... (16 files, 444.2KB)
Uninstalling /usr/local/Cellar/libtasn1/4.13... (59 files, 436KB)
Uninstalling /usr/local/Cellar/libunistring/0.9.10... (54 files, 4.4MB)
Uninstalling /usr/local/Cellar/nettle/3.4.1... (85 files, 2MB)
Uninstalling /usr/local/Cellar/p11-kit/0.23.15... (63 files, 2.9MB)
Uninstalling /usr/local/Cellar/gmp/6.1.2_2... (18 files, 3.1MB)
Uninstalling /usr/local/Cellar/libffi/3.2.1... (16 files, 296.8KB)
Uninstalling /usr/local/Cellar/libgpg-error/1.35... (27 files, 854.8KB)
Package gpg and its dependancies have been removed.
$ 
Kevin Davies
fuente
2

Otras respuestas no funcionaron para mí, pero esto sí (en fishshell):

brew remove <package>
for p in (brew deps <package>)
    brew remove $p
end

Porque brew remove $pfalla cuando algún otro paquete depende p.

Luke Miles
fuente
2

Una función de Bourne Shell más completa

Ya hay una serie de buenas respuestas, pero algunas están desactualizadas y ninguna de ellas está completamente completa. En particular, la mayoría de ellos eliminarán las dependencias, pero aún así le corresponde a usted eliminar la fórmula originalmente dirigida posteriormente. Los mensajes publicados también pueden ser tediosos si desea desinstalar más de una fórmula a la vez.

Aquí hay una función de shell compatible con Bourne (sin Bashismos conocidos) que toma una lista de fórmulas, elimina las dependencias de cada uno, elimina todas las copias de la fórmula en sí y luego reinstala las dependencias faltantes.

unbrew () {
    local formula
    for formula in "$@"; do
        brew deps "$formula" |
        xargs brew uninstall --ignore-dependencies --force
        brew uninstall --force "$formula"
    done
    brew missing | cut -f2 -d: | sort -u | xargs brew install
}

Fue probado en Homebrew 1.7.4.

Advertencias

Esto funciona en todas las fórmulas estándar que probé. Actualmente no maneja barriles, pero tampoco se quejará en voz alta si intenta desbloquear un barril con el mismo nombre que una fórmula estándar (por ejemplo, MacVim).

Todd A. Jacobs
fuente
1

La respuesta de @jfmercer debe modificarse ligeramente para funcionar con la preparación actual, porque la salida de brew missingha cambiado:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install
freytag
fuente