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 .


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 .


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.


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

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 .


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.


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

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

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.


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).


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.