Désinstaller / supprimer un package Homebrew incluant toutes ses dépendances

339

J'ai une formule Homebrew que je souhaite désinstaller / supprimer avec toutes ses dépendances, en ignorant les packages dont dépendent les autres packages (alias Suppression de packages en cascade dans le langage du gestionnaire de packages).

par exemple, désinstaller le package aqui dépend des packages b& c, où le package ddépend également du package c. Le résultat devrait désinstaller les deux a& b, en sautant c.

Comment puis je faire ça?

Il doit y avoir un moyen de désinstaller un paquet sans laisser de déchets inutiles .

Ory Band
la source
3
N'est-ce pas ce que tout gestionnaire de paquets, digne de ce nom, devrait faire dès le départ?! LOL
mljrg

Réponses:

407

ÉDITER:

Il semble que le problème soit désormais résolu à l'aide d'une commande externe appelée brew rmdepsoubrew rmtree .

Pour installer et utiliser, émettez les commandes suivantes:

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

Voir le lien ci-dessus pour plus d'informations et de discussion.


Réponse originale:

Il semble qu'actuellement, il n'y a pas de moyen facile d'y parvenir.

Cependant, j'ai déposé un problème sur la page GitHub de Homebrew , et quelqu'un a suggéré une solution temporaire jusqu'à ce qu'il ajoute une commande exclusive pour résoudre ce problème.

Il existe une commande externe appelée brew leavesqui affiche tous les packages qui ne sont pas des dépendances d'autres packages.

Si vous effectuez une opération logique et sur la sortie de brew leaveset brew deps <package>, vous pouvez simplement obtenir une liste des packages de dépendances orphelins, que vous pouvez désinstaller manuellement par la suite. Combinez cela avec xargset vous obtiendrez ce dont vous avez besoin, je suppose (non testé, ne comptez pas sur cela).


EDIT: Quelqu'un vient de suggérer une solution très similaire, en utilisant joinau lieu de xargs:

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

Voir le commentaire sur le problème mentionné ci-dessus pour plus d'informations.

Ory Band
la source
4
Deuxième ligne donne une erreur: This command requires a keg argument.
Shmidt
7
Le brew rmtreescript tiers est maintenant disponible dans un robinet:brew tap beeftornado/rmtree && brew install beeftornado/rmtree/brew-rmtree
Nick McCurdy
1
@NicolasMcCurdy J'ai essayé et je peux confirmer que c'est en effet le moyen le plus pratique de nos jours.
Ory Band
1
brew rm $(join <(brew leaves) <(brew deps FORMULA))fait bien le travail. Il vous suffit de l'exécuter encore et encore jusqu'à ce que toutes les dépendances soient supprimées. Il ne peut pas tout désinstaller à la fois car les dépendances sont interdépendantes.
Greg Wang
1
Le && brew install brew-rmtreen'est plus nécessaire.
Boris
34

Le but ici est de supprimer le package donné et ses dépendances sans casser les dépendances d'un autre package. J'utilise cette commande:

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

Remarque: Modifié pour refléter le commentaire utile de @ alphadogg.

jfmercer
la source
J'ai dû ajouter --ignore-dependenciesà supprimer pour que cela fonctionne.
alphadogg
2
Cela a cassé ma configuration de brassage, car il n'a pas réinstallé les dépôts utilisés dans d'autres packages. À NE PAS UTILISER
Marco Pappalardo
26

brew rmtree ne fonctionne pas du tout . À partir des liens sur cette question, j'ai trouvé rmrec qui fonctionne réellement. Dieu sait pourquoi brewn'a pas cela comme une commande native.

brew tap ggpeti/rmrec
brew rmrec pkgname
Timmmm
la source
J'adore vraiment cela, bien que si vous avez déjà commencé à vous désinstaller et continuez à trouver plus de packages que vous devez supprimer, vous devez toujours savoir quels sont les packages les plus larges, ou vous pouvez simplement réinstaller brièvement [FORMULA]puis utiliser rmrec pour supprimer récursivement toutes ses dépendances correctement.
dragon788
2
Mise en garde: Il semble également rmrecne pas gérer très bien les packages avec espace de noms actuellement. J'utilisais quelque chose qui s'est arrêté linuxbrew/xorg/xorget il a tout supprimé sauf ce paquet et même en nommant explicitement ce paquet, il n'a pas pu le résoudre et n'a rien fait.
dragon788
Confirmé que la recommandation d'utilisation rmrecest mauvaise. Il ne gère pas du tout les dépendances.
omdv
Tu veux dire rmtree? rmrecgère les dépendances.
Timmmm
1
God knows why brew doesn't have this as a native command.=> Parce que les développeurs de bière ont de mauvaises attitudes. Ils ne permettent même pas aux gens d'ouvrir des problèmes. Consultez github.com/Homebrew/brew , il ne contient plus que 20 problèmes maintenant. Un si petit nombre. Est-ce une bonne chose? Non, c'est très mauvais.
sgon00
15

Basé sur la réponse de @jfmercer (les corrections nécessitaient plus qu'un commentaire).

Supprimer les dépendances du package (ne supprime pas le package):

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

Supprimer le package:

brew remove [FORMULA]

Réinstallez les bibliothèques manquantes:

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

Désinstallation testée meldaprès avoir découvert les versions de MeldMerge .

voûte
la source
J'avais installé ffmpeg avec brew, ce qui a sérieusement gâché les choses. Le nettoyage de ffmpeg, y compris sa liste étendue de dépendances, avec la méthode décrite ci-dessus, a fonctionné pour moi.
webtweakers
13

Pour utiliser cette réponse, vous devez créer et gérer un fichier contenant les noms de package que vous souhaitez installer sur votre système. Si vous n'en avez pas déjà un, utilisez la commande suivante et supprimez les noms de package que vous ne souhaitez pas conserver installés.

brew leaves > brew_packages

Ensuite, vous pouvez supprimer tous les packages installés mais indésirables et toutes les dépendances inutiles en exécutant la commande suivante

brew_clean brew_packages

brew_cleanest disponible ici: https://gist.github.com/cskeeters/10ff1295bca93808213d

Ce script obtient tous les packages que vous avez spécifiés dans brew_packages et toutes leurs dépendances et les compare à la sortie de brew listet supprime enfin les packages indésirables après avoir vérifié cette liste avec l'utilisateur.

À ce stade, si vous souhaitez supprimer un package a, il vous suffit de le supprimer du fichier brew_packages, puis de le réexécuter brew_clean brew_packages. Il supprimera b, mais pas c.

Chad Skeeters
la source
Je pense que brew clean est intégré maintenant, essayezbrew clean -s
Devin G Rhode
1
LE COMMENTAIRE CI-DESSUS ÉTAIT MAUVAIS, l'édition retombe à 5 minutes. essayerbrew cleanup -s && brew cask cleanup
Devin G Rhode
5

Vous pouvez simplement utiliser un tuyau UNIX pour cela

brew deps [FORMULA] | xargs brew rm
métamorphosé
la source
12
Ce n'est pas une bonne solution. Vous pouvez casser les dépendances des autres packages de cette façon.
Ory Band
12
Il existe une commande que vous pouvez exécuter par la suite pour vous dire si vous avez annulé toute autre dépendance requise brew missingqui vous dira quelle commande vous devez exécuter pour les récupérer
SeanJA
4

Enregistrez le script suivant en tant que purge de brassage

#!/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

Maintenant, installez-le avec la commande suivante

sudo install brew-purge /usr/local/bin

Maintenant lancez-le

brew purge package

Exemple utilisant 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
la source
2

D'autres réponses n'ont pas fonctionné pour moi, mais cela a fonctionné (en fishcoquille):

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

Car brew remove $péchoue quand un autre paquet en dépend p.

Luke Miles
la source
2

Une fonction Bourne Shell plus complète

Il existe déjà un certain nombre de bonnes réponses, mais certaines sont obsolètes et aucune d'entre elles n'est entièrement complète. En particulier, la plupart d'entre eux supprimeront les dépendances mais vous laisseront le soin de supprimer la formule initialement ciblée par la suite. Les lignes simples publiées peuvent également être fastidieuses à utiliser si vous souhaitez désinstaller plusieurs formules à la fois.

Voici une fonction shell compatible Bourne (sans aucun bashism connu) qui prend une liste de formules, supprime les dépendances de chacun, supprime toutes les copies de la formule elle-même, puis réinstalle toutes les dépendances manquantes.

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
}

Il a été testé sur Homebrew 1.7.4.

Avertissements

Cela fonctionne sur toutes les formules standard que j'ai testées. Il ne gère pas actuellement les fûts, mais il ne se plaindra pas non plus si vous essayez de débrider un fût portant le même nom qu'une formule standard (par exemple MacVim).

Todd A. Jacobs
la source
1

La réponse de @jfmercer doit être légèrement modifiée pour fonctionner avec le brassage actuel, car la sortie de brew missinga changé:

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