Odinstaluj / usuń pakiet Homebrew wraz ze wszystkimi jego zależnościami

339

Mam formułę Homebrew , którą chcę odinstalować / usunąć wraz ze wszystkimi jej zależnościami, pomijając pakiety, od których zależą inne pakiety (inaczej zwane usuwaniem pakietów kaskadowych w języku Menedżer pakietów).

np. Odinstaluj pakiet, aktóry zależy od pakietów bi c, gdzie pakiet drównież zależy od pakietu c. Wynik powinien odinstalować oba a& b, pomijając c.

Jak mogę to zrobić?

Musi istnieć sposób na odinstalowanie pakietu bez pozostawiania niepotrzebnych śmieci .

Ory Band
źródło
3
Czy nie to powinien zrobić każdy menedżer pakietów, warty tej nazwy, po wyjęciu z pudełka ?! LOL
mljrg

Odpowiedzi:

407

EDYTOWAĆ:

Wygląda na to, że problem został rozwiązany za pomocą zewnętrznego polecenia o nazwie brew rmdepslubbrew rmtree .

Aby zainstalować i używać, wydaj następujące polecenia:

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

Zobacz powyższy link, aby uzyskać więcej informacji i dyskusji.


Oryginalna odpowiedź:

Wygląda na to, że obecnie nie ma łatwego sposobu na osiągnięcie tego.

Jednak zgłosiłem problem na stronie GitHub Homebrew i ktoś zaproponował tymczasowe rozwiązanie, dopóki nie doda wyłącznego polecenia, aby rozwiązać ten problem.

Istnieje zewnętrzne polecenie o nazwie, brew leavesktóre wypisuje wszystkie pakiety, które nie są zależnościami innych pakietów.

Jeśli wykonasz logikę i na wyjściu brew leavesi brew deps <package>, możesz po prostu uzyskać listę osieroconych pakietów zależności, które możesz później odinstalować ręcznie. Połącz to z, xargsa dostaniesz to, czego potrzebujesz, tak sądzę (niesprawdzone, nie licz na to).


EDYCJA: Ktoś właśnie zaproponował bardzo podobne rozwiązanie, używając joinzamiast xargs:

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

Aby uzyskać więcej informacji, zobacz komentarz do wyżej wymienionego problemu .

Ory Band
źródło
4
Druga linia daje błąd: This command requires a keg argument.
Shmidt,
7
brew rmtreeSkrypt innej firmy jest teraz dostępny w kranu:brew tap beeftornado/rmtree && brew install beeftornado/rmtree/brew-rmtree
Nick McCurdy
1
@NicolasMcCurdy Próbowałem i mogę potwierdzić, że jest to obecnie najbardziej przekonujący sposób.
Ory Band
1
brew rm $(join <(brew leaves) <(brew deps FORMULA))dobrze wykonuje swoją pracę. Musisz tylko uruchamiać go wielokrotnie, aż wszystkie zależności zostaną usunięte. Nie można odinstalować wszystkiego naraz, ponieważ zależności są od siebie zależne.
Greg Wang
1
To && brew install brew-rmtreenie jest już konieczne.
Boris
34

Celem jest usunięcie danego pakietu i jego zależności bez przerywania zależności innego pakietu. Używam tego polecenia:

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

Uwaga: Edytowane w celu odzwierciedlenia pomocnego komentarza @ alphadogg.

jfmercer
źródło
Musiałem dodać, --ignore-dependenciesaby usunąć, aby to zadziałało.
alphadogg,
2
To zepsuło moją konfigurację parzenia, ponieważ nie przeinstalowało deps, które są używane w innych pakietach. NIE UŻYWAJ
Marco Pappalardo
25

brew rmtree w ogóle nie działa . Z linków na ten temat znalazłem rmrec, który faktycznie działa. Bóg wie, dlaczego brewnie ma tego jako natywnego polecenia.

brew tap ggpeti/rmrec
brew rmrec pkgname
Timmmm
źródło
Naprawdę UWIELBIAM to, chociaż jeśli już zacząłeś się na drodze do samodzielnego odinstalowywania i nadal znajdowałeś więcej pakietów, które musisz usunąć, nadal musisz wiedzieć, które są najszerzej dotykające pakiety, lub możesz tylko krótko zainstalować ponownie, [FORMULA]a następnie użyć rmrec aby rekurencyjnie usunąć wszystkie jego zależności.
dragon788
2
Uwaga: Wygląda na rmrecto, że obecnie nie obsługuje zbyt dobrze pakietów z przestrzenią nazw. Używałem czegoś, co ściągnęło linuxbrew/xorg/xorgi usunęło wszystko oprócz tego pakietu, a nawet jawnie nadając mu nazwę, nie mogło go rozwiązać i nic nie zrobiło.
dragon788
Potwierdził, że zalecenie użycia rmrecjest złe. W ogóle nie obsługuje zależności.
omdv,
Masz na myśli rmtree? rmrecobsługuje zależności.
Timmmm,
1
God knows why brew doesn't have this as a native command.=> Ponieważ twórcy piwa mają złe nastawienie. Nie pozwalają nawet ludziom otwierać żadnych problemów. Sprawdź github.com/Homebrew/brew , ma teraz tylko mniej niż 20 problemów. Tak mała liczba. Czy to dobrze? Nie, to bardzo źle.
sgon00
15

Na podstawie odpowiedzi @jfmercer (poprawki wymagają więcej niż komentarza).

Usuń zależności pakietu (nie usuwa pakietu):

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

Usuń paczkę:

brew remove [FORMULA]

Ponownie zainstaluj brakujące biblioteki:

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

Testowanie deinstalacji meldpo wykryciu wersji MeldMerge .

sklepienie
źródło
Zainstalowałem ffmpeg z naparami, które poważnie coś popsuły. Czyszczenie ffmpeg, w tym jego rozszerzonej listy zależności, przy użyciu metody opisanej powyżej, działało dla mnie.
webtweakers
13

Użycie tej odpowiedzi wymaga utworzenia i utrzymania pliku zawierającego nazwy pakietów, które chcesz zainstalować w systemie. Jeśli jeszcze go nie masz, użyj następującego polecenia i usuń nazwy pakietów, których nie chcesz instalować.

brew leaves > brew_packages

Następnie możesz usunąć wszystkie zainstalowane, ale niechciane pakiety i wszelkie niepotrzebne zależności, uruchamiając następujące polecenie

brew_clean brew_packages

brew_cleanjest dostępny tutaj: https://gist.github.com/cskeeters/10ff1295bca93808213d

Ten skrypt pobiera wszystkie pakiety określone w brew_packages i wszystkie ich zależności i porównuje je z danymi wyjściowymi, brew lista na koniec usuwa niechciane pakiety po zweryfikowaniu tej listy z użytkownikiem.

W tym momencie, jeśli chcesz usunąć pakiet a, po prostu usuń go z pliku brew_packages, a następnie uruchom ponownie brew_clean brew_packages. Usunie b, ale nie c.

Czad Skeeters
źródło
Myślę, że brew clean jest teraz wbudowany, spróbujbrew clean -s
Devin G Rhode,
1
POWYŻSZY KOMENTARZ BYŁ NIEPRAWIDŁOWY, edycja została przerwana po 5 minutach. spróbujbrew cleanup -s && brew cask cleanup
Devin G Rhode,
5

Możesz po prostu użyć do tego potoku UNIX

brew deps [FORMULA] | xargs brew rm
kształtowany
źródło
12
To nie jest dobre rozwiązanie. W ten sposób możesz przełamać zależności innych pakietów.
Ory Band
12
Istnieje polecenie, które można następnie uruchomić, aby poinformować, czy nukowano jakiekolwiek inne wymagane zależności, brew missingktóre powiedzą, jakie polecenie należy uruchomić, aby je odzyskać
SeanJA
4

Zapisz następujący skrypt jako zaparzanie

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

Teraz zainstaluj go za pomocą następującego polecenia

sudo install brew-purge /usr/local/bin

Teraz uruchom

brew purge package

Przykład użycia 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
źródło
2

Inne odpowiedzi nie działały dla mnie, ale to zadziałało (w fishpowłoce):

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

Ponieważ brew remove $pkończy się niepowodzeniem, gdy zależy od innego pakietu p.

Luke Miles
źródło
2

Pełniejsza funkcja powłoki Bourne'a

Istnieje już wiele dobrych odpowiedzi, ale niektóre są nieaktualne i żadna z nich nie jest kompletna. W szczególności większość z nich usunie zależności, ale nadal możesz pozostawić oryginalną formułę docelową później. Wysłane jedno-linijki mogą być również uciążliwe w pracy, jeśli chcesz odinstalować więcej niż jedną formułę na raz.

Oto funkcja powłoki kompatybilna z Bourne'em (bez żadnych znanych bashizmów), która pobiera listę formuł, usuwa zależności każdego z nich, usuwa wszystkie kopie samej formuły, a następnie przywraca wszelkie brakujące zależności.

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
}

Został przetestowany na Homebrew 1.7.4.

Ostrzeżenia

Działa to na wszystkich standardowych formułach, które przetestowałem. Obecnie nie obsługuje beczek, ale nie będzie też głośno narzekać, jeśli spróbujesz rozpakować beczkę o tej samej nazwie co standardowa formuła (np. MacVim).

Todd A. Jacobs
źródło
1

Odpowiedź @jfmercer musi zostać nieznacznie zmodyfikowana, aby działała z bieżącym naparem, ponieważ brew missingzmieniła się moc wyjściowa :

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install
freytag
źródło