Disinstalla / rimuovi un pacchetto Homebrew comprese tutte le sue dipendenze


339

Ho una formula Homebrew che desidero disinstallare / rimuovere insieme a tutte le sue dipendenze, saltando i pacchetti da cui dipendono altri pacchetti (ovvero la rimozione del pacchetto Cascading nel linguaggio Gestore pacchetti).

ad es. disinstallare il pacchetto ache dipende dai pacchetti be c, dove il pacchetto ddipende anche dal pacchetto c. Il risultato dovrebbe disinstallare sia a& b, saltando c.

Come lo posso fare?

Ci deve essere un modo per disinstallare un pacchetto senza lasciare spazzatura inutile .


3
Non è quello che qualsiasi gestore di pacchetti, degno di questo nome, dovrebbe fare immediatamente ?! LOL
mljrg,

Risposte:


407

MODIFICARE:

Sembra che il problema sia stato risolto usando un comando esterno chiamato brew rmdepsobrew rmtree .

Per installare e utilizzare, immettere i seguenti comandi:

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

Vedi il link sopra per maggiori informazioni e discussioni.


Risposta originale:

Sembra che al momento non ci sia un modo semplice per farlo.

Tuttavia, ho presentato un problema sulla pagina GitHub di Homebrew e qualcuno ha suggerito una soluzione temporanea fino a quando non ha aggiunto un comando esclusivo per risolverlo.

C'è un comando esterno chiamato brew leavesche stampa tutti i pacchetti che non sono dipendenze di altri pacchetti.

Se si esegue un logico e sull'output di brew leavese brew deps <package>, si potrebbe semplicemente ottenere un elenco dei pacchetti di dipendenza orfani, che è possibile disinstallare manualmente in seguito. Combina questo con xargse otterrai ciò di cui hai bisogno, immagino (non testato, non contare su questo).


EDIT: Qualcuno ha appena suggerito una soluzione molto simile, usando joininvece di xargs:

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

Vedi il commento sul problema sopra menzionato per maggiori informazioni.


4
Seconda linea dà un errore: This command requires a keg argument.
Shmidt,

7
Lo brew rmtreescript di terze parti è ora disponibile in un tocco:brew tap beeftornado/rmtree && brew install beeftornado/rmtree/brew-rmtree
Nick McCurdy,

1
@NicolasMcCurdy Ho provato e posso confermare che questo è davvero il modo più conveniente al giorno d'oggi.
Ory Band,

1
brew rm $(join <(brew leaves) <(brew deps FORMULA))fa bene il lavoro. Devi solo eseguirlo ancora e ancora fino a quando tutte le dipendenze vengono rimosse. Non è possibile disinstallare tutto in una volta perché le dipendenze sono interdipendenti tra loro.
Greg Wang,

1
Non && brew install brew-rmtreeè più necessario.
Boris,

34

L'obiettivo qui è quello di rimuovere il pacchetto dato e le sue dipendenze senza interrompere le dipendenze di un altro pacchetto. Io uso questo comando:

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

Nota: modificato per riflettere il commento utile di @ alphadogg.


Ho dovuto aggiungere --ignore-dependenciesper rimuovere per consentire a questo di funzionare.
alphadogg,

2
Questo ha rotto la mia configurazione brew, in quanto non ha reinstallato i deps utilizzati in altri pacchetti. NON USARE
Marco Pappalardo,

26

brew rmtree non funziona affatto . Dai link su quel problema ho trovato rmrec che in realtà funziona. Dio sa perché brewnon ha questo come comando nativo.

brew tap ggpeti/rmrec
brew rmrec pkgname

ADORO davvero questo, anche se se hai già iniziato il percorso di disinstallazione e continui a trovare altri pacchetti che devi rimuovere, devi comunque sapere quali sono i pacchetti più ampi toccanti, oppure puoi semplicemente reinstallare brevemente [FORMULA]e quindi utilizzare rmrec per rimuovere in modo ricorsivo tutte le sue dipendenze correttamente.
dragon788,

2
Avvertenza: sembra rmrecche al momento non gestisca molto bene i pacchetti con spaziatura dei nomi. Stavo usando qualcosa che è stato inserito linuxbrew/xorg/xorge ha rimosso tutto tranne quel pacchetto e anche nominando esplicitamente quel pacchetto non è stato in grado di risolverlo e non ha fatto nulla.
dragon788,

Confermato che la raccomandazione per l'uso rmrecè negativa. Non gestisce affatto le dipendenze.
omdv,

Intendi rmtree? rmrecgestisce le dipendenze.
Timmmm,

1
God knows why brew doesn't have this as a native command.=> Perché gli sviluppatori della birra hanno cattivi atteggiamenti. Non consentono nemmeno alle persone di aprire qualsiasi problema. Controlla github.com/Homebrew/brew , ha solo meno di 20 problemi ora. Un numero così piccolo. Questa è una buona cosa? No, è molto male.
sgon00,

15

Basato sulla risposta di @jfmercer (le correzioni richiedevano più di un commento).

Rimuovi le dipendenze del pacchetto (non rimuove il pacchetto):

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

Rimuovi pacchetto:

brew remove [FORMULA]

Reinstalla le librerie mancanti:

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

Disinstallazione testata melddopo aver scoperto le versioni di MeldMerge .


Avevo installato ffmpeg con brew, che rovinava gravemente le cose. La pulizia di ffmpeg, incluso il suo elenco esteso di dipendenze, con il metodo sopra descritto, ha funzionato per me.
webtweakers

13

L'utilizzo di questa risposta richiede la creazione e la gestione di un file contenente i nomi dei pacchetti che si desidera installare sul proprio sistema. Se non ne possiedi già uno, usa il seguente comando ed elimina i nomi dei pacchetti che non desideri mantenere installati.

brew leaves > brew_packages

Quindi è possibile rimuovere tutti i pacchetti installati, ma indesiderati e tutte le dipendenze non necessarie eseguendo il comando seguente

brew_clean brew_packages

brew_cleanè disponibile qui: https://gist.github.com/cskeeters/10ff1295bca93808213d

Questo script ottiene tutti i pacchetti specificati in brew_packages e tutte le loro dipendenze e li confronta con l'output di brew liste infine rimuove i pacchetti indesiderati dopo aver verificato questo elenco con l'utente.

A questo punto, se si desidera rimuovere il pacchetto a, è sufficiente rimuoverlo dal file brew_packages, quindi eseguire nuovamente brew_clean brew_packages. Rimuoverà b, ma non c.


Penso che brew clean sia integrato adesso, provalobrew clean -s
Devin G Rhode,

1
SOPRA IL COMMENTO È STATO SBAGLIATO, la modifica si interrompe in 5 minuti. provarebrew cleanup -s && brew cask cleanup
Devin G Rhode,

5

Per questo, puoi semplicemente usare una pipe UNIX

brew deps [FORMULA] | xargs brew rm

12
Questa non è una buona soluzione. È possibile interrompere le dipendenze di altri pacchetti in questo modo.
Ory Band,

12
C'è un comando che puoi eseguire in seguito per dirti se hai cancellato qualsiasi altra dipendenza richiesta brew missingche ti dirà quale comando devi eseguire per recuperarli
SeanJA

4

Salvare il seguente script come 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

Ora installalo con il seguente comando

sudo install brew-purge /usr/local/bin

Adesso eseguilo

brew purge package

Esempio 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.
$ 

2

Altre risposte non hanno funzionato per me, ma questo ha funzionato (in fishshell):

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

Perché brew remove $pfallisce quando dipende da qualche altro pacchetto p.


2

Una funzione Bourne Shell più completa

Esistono già numerose risposte valide, ma alcune sono obsolete e nessuna di esse è del tutto completa. In particolare, la maggior parte di essi rimuoverà le dipendenze, ma lascerà comunque a te la rimozione della formula originariamente mirata in seguito. Anche le linee singole pubblicate possono essere noiose con cui lavorare se si desidera disinstallare più di una formula alla volta.

Ecco una funzione di shell compatibile con Bourne (senza alcun Bashismo noto) che prende un elenco di formule, rimuove le dipendenze di ciascuno, rimuove tutte le copie della formula stessa e quindi reinstalla eventuali dipendenze mancanti.

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
}

È stato testato su Homebrew 1.7.4.

Avvertenze

Funziona su tutte le formule standard che ho testato. Attualmente non gestisce le botti, ma non si lamenterà nemmeno se si tenta di estrarre una botte con lo stesso nome di una formula standard (ad esempio MacVim).


1

La risposta di @jfmercer deve essere leggermente modificata per funzionare con l'attuale brew, perché l'output di brew missingè cambiato:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.