Deinstallieren / entfernen Sie ein Homebrew-Paket einschließlich aller Abhängigkeiten

338

Ich habe eine Homebrew- Formel, die ich zusammen mit all ihren Abhängigkeiten deinstallieren / entfernen möchte, wobei Pakete übersprungen werden, von denen andere Pakete abhängen (auch bekannt als Cascading Package Remove in Package Manager).

zB Deinstallieren Sie das Paket, adas von den Paketen b& abhängt c, wobei das Paket dauch vom Paket abhängt c. Das Ergebnis sollte sowohl a& deinstallieren als bauch überspringen c.

Wie kann ich das machen?

Es muss eine Möglichkeit geben, ein Paket zu deinstallieren, ohne unnötigen Müll zurückzulassen.

Ory Band
quelle
3
Ist es nicht das, was ein Paketmanager, der diesen Namen wert ist, sofort tun sollte?! LOL
mljrg

Antworten:

406

BEARBEITEN:

Es sieht so aus, als ob das Problem jetzt mit einem externen Befehl namens brew rmdepsoder behoben wirdbrew rmtree .

Geben Sie zur Installation und Verwendung die folgenden Befehle aus:

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

Weitere Informationen und Diskussionen finden Sie unter dem obigen Link.


Ursprüngliche Antwort:

Es scheint, dass es derzeit keinen einfachen Weg gibt, dies zu erreichen.

Ich habe jedoch ein Problem auf der GitHub-Seite von Homebrew eingereicht , und jemand hat eine vorübergehende Lösung vorgeschlagen, bis er einen exklusiven Befehl zur Lösung dieses Problems hinzugefügt hat.

Es wird ein externer Befehl aufgerufen, brew leavesder alle Pakete druckt, die keine Abhängigkeiten von anderen Paketen sind.

Wenn Sie eine logische und bei der Ausgabe von brew leavesund brew deps <package>ausführen, erhalten Sie möglicherweise nur eine Liste der verwaisten Abhängigkeitspakete, die Sie anschließend manuell deinstallieren können. Kombinieren Sie dies mit xargsund Sie werden bekommen, was Sie brauchen, denke ich (ungetestet, rechnen Sie nicht damit).


EDIT: Jemand hat gerade eine sehr ähnliche Lösung vorgeschlagen, joinanstatt xargs:

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

Weitere Informationen finden Sie im Kommentar zu dem oben genannten Problem .

Ory Band
quelle
4
Die zweite Zeile gibt einen Fehler aus : This command requires a keg argument.
Shmidt
7
Das brew rmtreeSkript eines Drittanbieters ist jetzt verfügbar:brew tap beeftornado/rmtree && brew install beeftornado/rmtree/brew-rmtree
Nick McCurdy
1
@NicolasMcCurdy Ich habe es versucht und kann bestätigen, dass dies heutzutage tatsächlich der bequemste Weg ist.
Ory Band
1
brew rm $(join <(brew leaves) <(brew deps FORMULA))macht den Job gut. Sie müssen es nur immer wieder ausführen, bis alle Abhängigkeiten entfernt sind. Es kann nicht alles auf einmal deinstalliert werden, da die Abhängigkeiten voneinander abhängig sind.
Greg Wang
1
Das && brew install brew-rmtreeist nicht mehr nötig.
Boris
34

Das Ziel hier ist es, das angegebene Paket und seine Abhängigkeiten zu entfernen, ohne die Abhängigkeiten eines anderen Pakets zu zerstören. Ich benutze diesen Befehl:

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

Hinweis: Bearbeitet, um den hilfreichen Kommentar von @ alphadogg wiederzugeben.

jfmercer
quelle
Musste hinzufügen --ignore-dependencies, um zu entfernen, damit dies funktioniert.
Alphadogg
2
Dies hat meine Braukonfiguration beschädigt, da die in anderen Paketen verwendeten Deps nicht neu installiert wurden. NICHT VERWENDEN
Marco Pappalardo
25

brew rmtree funktioniert überhaupt nicht . Über die Links zu diesem Thema habe ich rmrec gefunden, das tatsächlich funktioniert. Gott weiß, warum brewdies nicht als einheimischer Befehl gilt.

brew tap ggpeti/rmrec
brew rmrec pkgname
Timmmm
quelle
LIEBE das wirklich, aber wenn du bereits begonnen hast, dich selbst zu deinstallieren und immer mehr Pakete zu finden, die du entfernen musst, musst du immer noch wissen, was die am weitesten berührenden Pakete sind, oder du kannst das einfach kurz neu installieren [FORMULA]und dann rmrec verwenden rekursiv alle Abhängigkeiten ordnungsgemäß zu entfernen.
Dragon788
2
Vorsichtsmaßnahme: Es scheint rmrecauch, dass Pakete mit Namespace derzeit nicht sehr gut verarbeitet werden. Ich habe etwas verwendet, das eingezogen wurde, linuxbrew/xorg/xorgund es hat alles außer diesem Paket entfernt und sogar dieses Paket explizit benannt, es konnte es nicht auflösen und hat nichts getan.
Dragon788
Bestätigt, dass die Empfehlung zur Verwendung rmrecschlecht ist. Abhängigkeiten werden überhaupt nicht behandelt.
Omdv
Du meinst rmtree? rmrecbehandelt Abhängigkeiten.
Timmmm
1
God knows why brew doesn't have this as a native command.=> Weil Brauentwickler schlechte Einstellungen haben. Sie erlauben den Leuten nicht einmal, irgendwelche Probleme zu eröffnen. Überprüfen Sie github.com/Homebrew/brew , es hat jetzt nur weniger als 20 Probleme. So eine kleine Anzahl. Ist das eine gute Sache? Nein, es ist sehr schlimm.
sgon00
15

Basierend auf der Antwort von @jfmercer (Korrekturen sind mehr als ein Kommentar erforderlich).

Entfernen Sie die Abhängigkeiten des Pakets (entfernt das Paket nicht):

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

Paket entfernen:

brew remove [FORMULA]

Fehlende Bibliotheken neu installieren:

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

Getestete Deinstallation meldnach dem Erkennen von MeldMerge-Versionen .

Gewölbe
quelle
Ich hatte ffmpeg mit Brew installiert, was die Dinge stark durcheinander brachte. Das Bereinigen von ffmpeg einschließlich der erweiterten Liste der Abhängigkeiten mit der oben beschriebenen Methode hat bei mir funktioniert.
Webtweakers
13

Um diese Antwort zu verwenden, müssen Sie eine Datei erstellen und verwalten, die die Paketnamen enthält, die auf Ihrem System installiert werden sollen. Wenn Sie noch keinen haben, verwenden Sie den folgenden Befehl und löschen Sie die Paketnamen, die nicht installiert bleiben sollen.

brew leaves > brew_packages

Anschließend können Sie alle installierten, aber unerwünschten Pakete und unnötigen Abhängigkeiten entfernen, indem Sie den folgenden Befehl ausführen

brew_clean brew_packages

brew_cleanist hier verfügbar: https://gist.github.com/cskeeters/10ff1295bca93808213d

Dieses Skript ruft alle Pakete ab, die Sie in brown_packages angegeben haben, sowie alle ihre Abhängigkeiten und vergleicht sie mit der Ausgabe von brew listund entfernt schließlich die unerwünschten Pakete, nachdem diese Liste mit dem Benutzer überprüft wurde.

Wenn Sie zu diesem Zeitpunkt das Paket entfernen möchten, entfernen aSie es einfach aus der Datei brown_packages und führen Sie es erneut aus brew_clean brew_packages. Es wird entfernt b, aber nicht c.

Chad Skeeters
quelle
Ich denke, Brew Clean ist jetzt eingebaut, versuchen Sie esbrew clean -s
Devin G Rhode
1
Der obige Kommentar war falsch, die Bearbeitung wurde nach 5 Minuten unterbrochen. versuchen Siebrew cleanup -s && brew cask cleanup
Devin G Rhode
5

Sie können hierfür einfach eine UNIX-Pipe verwenden

brew deps [FORMULA] | xargs brew rm
geformt
quelle
12
Dies ist keine gute Lösung. Auf diese Weise können Sie die Abhängigkeiten anderer Pakete aufheben.
Ory Band
12
Es gibt einen Befehl, den Sie anschließend ausführen können, um zu erfahren, ob Sie andere erforderliche Abhängigkeiten beseitigt brew missinghaben. Dieser sagt Ihnen, welchen Befehl Sie ausführen müssen, um sie zurückzubekommen
SeanJA,
4

Speichern Sie das folgende Skript als 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

Installieren Sie es nun mit dem folgenden Befehl

sudo install brew-purge /usr/local/bin

Führen Sie es jetzt aus

brew purge package

Beispiel mit 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
quelle
2

Andere Antworten haben bei mir nicht funktioniert, aber das hat (in der fishShell) funktioniert :

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

Weil brew remove $pfehlschlägt, wenn ein anderes Paket davon abhängt p.

Luke Miles
quelle
2

Eine umfassendere Bourne Shell-Funktion

Es gibt bereits eine Reihe guter Antworten, aber einige sind veraltet und keine vollständig. Insbesondere entfernen die meisten von ihnen Abhängigkeiten, überlassen es Ihnen jedoch, die ursprünglich anvisierte Formel anschließend zu entfernen. Die Arbeit mit den veröffentlichten Einzeilern kann auch mühsam sein, wenn Sie mehr als eine Formel gleichzeitig deinstallieren möchten.

Hier ist eine Bourne-kompatible Shell-Funktion (ohne bekannte Bashisms), die eine Liste von Formeln erstellt, die jeweiligen Abhängigkeiten entfernt, alle Kopien der Formel selbst entfernt und dann fehlende Abhängigkeiten neu installiert.

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
}

Es wurde auf Homebrew 1.7.4 getestet.

Vorsichtsmaßnahmen

Dies funktioniert mit allen Standardformeln, die ich getestet habe. Derzeit werden keine Fässer verarbeitet, aber es wird auch nicht lautstark beanstandet, wenn Sie versuchen, ein Fass mit dem gleichen Namen wie eine Standardformel (z. B. MacVim) zu lösen.

Todd A. Jacobs
quelle
1

Die Antwort von @jfmercer muss leicht geändert werden, um mit dem aktuellen Gebräu zu arbeiten, da sich die Ausgabe von brew missinggeändert hat:

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