Jak usunąć nieużywane pakiety MacPorts?

94

Ilekroć instaluję program za pośrednictwem MacPorts, pobiera i instaluje wiele zależności. Kiedy odinstalowuję wspomniany program, jak sprawić, aby MacPorts rekurencyjnie usuwał z nim wszystkie nieużywane zależności?

hpy
źródło

Odpowiedzi:

105

Aby uniknąć przypadkowego cięcia liści, które mogą być czymś, o co prosiłeś, powinieneś zainstalować port_cutleavespakiet, a następnie uruchomić sudo port_cutleaves https://guide.macports.org/#using.common-tasks.keeplean


MacPorts 1.9.0 dodał,sqlite portdbformat a MacPorts 2.0.0 porzucił stary flatformat . sqliteFormat portem DB jest domyślny dla nowych instalacji; stare instalacje zaktualizowane do wersji 1.9.x będą nadal korzystać z flatformatu 1 . Możesz przekonwertować flatsystem 1.9.x na sqliteformat, uaktualniając do MacPorts 2.0 lub zmieniając portdbformatwartość w, /opt/local/etc/macports/macports.confa następnie wydając polecenie port jako root (np sudo port installed.).

Jedną z cech nowego formatu jest to, że śledzi on „wymagane” i „niepotrzebne” instalacje portów. Niewymagany port to taki, który został zainstalowany tylko dlatego, że zależy od niego inny port. leavesPseudo-nazwa_portu rozszerza się do wszystkich Niepożądany portów, na których nikt inny zainstalowany portu zależy. Możesz użyć tego do „wyczyszczenia” niepotrzebnych portów, nawet jeśli pierwotnie ich nie odinstalowałeś sudo port uninstall --follow-dependencies portname(co zrobi, co chcesz, ale tylko jeśli pamiętasz, aby używać go za każdym razem, gdy coś odinstalowujesz).


Przed odinstalowaniem któregokolwiek z nich powinieneś sprawdzić istniejące liście.

port echo leaves

Niektóre wspólne liście ( automake, gperf, libtool, pkgconfig) są w czasie budowy zależności typowych portów, więc może chcesz „żądanie” je ( sudo port setrequested port1 port2 port3 …), aby uniknąć ich odinstalowanie prostu musiał ponownie zainstalować je później.

Możesz całkiem łatwo odinstalować pozostałe liście:

sudo port uninstall leaves

Uwaga: przed przycięciem liści możesz również odinstalować stare wersje portów, które nie są już „aktywne”. Może to ujawnić kilka dodatkowych liści (tzn. Portów, które są zależnościami portów, które są zainstalowane, ale nieaktywne):

sudo port uninstall inactive

W Przewodniku MacPorts znajduje się kilka sekcji, w których opisano również proces odinstalowywania niepotrzebnych portów.leaves

Chris Johnsen
źródło
11
Dzięki. To jest bardzo pomocne. Wygląda na to, że konieczne może być kilkukrotne uruchomienie liści echa i odinstalowanie liści, aby upewnić się, że wszystkie liście są wyczyszczone. Uruchomiłem oba polecenia co najmniej 4 razy, zanim echo pozostawiło pusty wynik
Antony
6
Można powiedzieć coś takiego, while sudo port uninstall leaves; do :; doneaby to zautomatyzować.
Tom Anderson
2
@ChrisJohnsen sudo port uninstall --follow-dependents portnamejest niepoprawny, ponieważ --follow-dependents„rekurencyjnie odinstaluje wszystkie porty zależne od określonego portu”. Poprawna jest tutaj opcja --follow-dependencies, która „rekurencyjnie odinstaluje wszystkie porty, od których zależał określony port. Nie spowoduje to odinstalowania zależności oznaczonych jako żądane lub posiadających inne zależności”.
TachyonVortex
8

Z dokumentów :

Deinstalacja odinstaluje zainstalowany port.

%% sudo port uninstall vile Note

Aby również rekurencyjnie odinstalować porty, od których zależy dany port, użyj ‑‑follow‑dependenciesflagi. Nie spowoduje to odinstalowania zależności oznaczonych jako żądane lub posiadających inne zależności.

Aby rekurencyjnie odinstalować wszystkie porty zależne od danego portu przed odinstalowaniem samego portu, użyj ‑‑follow‑dependents flag.

Jeśli port jest zależny od innego zainstalowanego portu, odinstalowanie go nie usunie, chyba że najpierw usuniesz zależne porty. Aby zastąpić to zachowanie, użyj przełącznika -f (force). To oczywiście złamie osoby na utrzymaniu. Nie wymuszaj odinstalowywania portów, chyba że wiesz, co robisz.

%% sudo port -f uninstall vile

Zwróć uwagę na główne zastrzeżenie w ostatnim akapicie. Zależności są dokładnie takie - zależności - a różne aplikacje mogą (będą) wymagać tych samych zależności.

Philip Regan
źródło
Nie sądzę, że to odpowiada na pytanie. OP chce usunąć program i rzeczy, których potrzebuje, a nie program i rzeczy, które go wymagają.
2
@mankoff: ‑‑follow‑dependenciesvs ‑‑follow‑dependents.; cytowany fragment opisuje oba, ale tylko pierwsze odnosi się do pytania
Chris Johnsen
3
Osobiście uważam, że to świetnie, że Filip wyjaśnia oba parametry, więc jesteśmy w pełni świadomi parametrów i ich implikacji po wydaniu takiego polecenia
Antony
3

Polecenie usunięcia portu i jego elementów zależnych to:

sudo port uninstall foo --follow-dependents

Jeśli jednak deinstalowany port ma zależności, nie zostanie odinstalowany bez -fflagi (wymuś).

Oczywiście powinieneś zacząć od przeczytania Przewodnika MacPorts, w szczególności w sekcji Przewodnika dezinstalacji.

Andrei Freeman
źródło
3

W katalogu contrib MacPorts znajduje się również skrypt o nazwie port_cutleaves, który można uruchomić, aby usunąć niepotrzebne zależności: http://trac.macports.org/browser/contrib/ . Poprosi Cię o każdy port, który ma zostać odinstalowany i pozwoli zachować niektóre, jeśli chcesz.

Clemens Lang
źródło
2

Napisałem kilka skryptów do automatyzacji czyszczenia portów: https://github.com/vasi/macports-tools

Skrypt „macportsfoster” wyświetli listę wszystkich portów niewymaganych przez nic na liście żądań, uporządkowany w taki sposób, że „port dezaktywuj $ (macportsfoster)” usunie je wszystkie za jednym razem.

vasi
źródło
1

Myślę, że inne odpowiedzi i --follow-dependentsflaga nie rób tego, co chcesz. Jeśli zainstalujesz Ai Awymaga B, to dzięki wspaniałym systemom zarządzania pakietami Bzostanie dla Ciebie zainstalowany. Możesz odinstalować, Ba --follow-dependentsflaga będzie wiedzieć i usunąć A. Ale co, jeśli odinstalujesz A, co jest bardziej prawdopodobne, ponieważ Ato, co ręcznie zainstalowałeś w pierwszej kolejności? W takim przypadku Bpozostaje w tyle.

Jeśli używasz fink, pakiet debfoster jest zaprojektowany do czyszczenia systemu i usuwania nieużywanych zależności.

Debfoster pomoże ci pozbyć się pakietów (na przykład bibliotek) pozostawionych w systemie, gdy program, który tego wymagał, został usunięty lub uaktualniony do wersji, która nie ma zależności.

Chociaż debfosternie będzie działać na MacPorts, wydaje się, że istnieją porty debfoster, na przykład portsfoster, chociaż wydaje się, że został wycofany ...

Być może obecnie nie istnieje żadne rozwiązanie dla MacPorts.


źródło
Ale czy nie jest debfoster dla plików deb w systemie opartym na Debianie? Jak używać go do portów MacPorts w Mac OS X?
hpy 13.03.11
Został przeniesiony do OS X i MacPorts, a fink jest oparty na aptsystemie używanym przez Debiana. Nie używam MacPorts, ale zrobiłem fink install debfosteri działało to dobrze dla mnie.
MacPorts nie jest powiązany z aptsystemem i nie używa debplików. Idea MacPorts jest związana z portami FreeBSD lub pkgsrc NetBSD, ale implementacja jest zupełnie inna.
Chris Johnsen
1
DOBRZE. Dziękuję za poprawienie mnie. Niezależnie od tego debfoster został przeniesiony, aby dobrze działać fink. Dalsze wyszukiwanie pokazuje, że to nie działa z MacPorts, ale istnieją klony, na przykład zobaczportsfoster