So entfernen Sie nicht verwendete MacPorts-Pakete?

94

Immer wenn ich ein Programm über MacPorts installiere, werden viele Abhängigkeiten abgerufen und installiert. Wie kann ich bei der Deinstallation dieses Programms dafür sorgen, dass MacPorts alle nicht verwendeten Abhängigkeiten rekursiv entfernt?

hpy
quelle

Antworten:

105

Um zu vermeiden, dass Blätter versehentlich abgeschnitten werden, sollten Sie das port_cutleavesPaket installieren und dann https://guide.macports.org/#using.common-tasks.keeplean ausführensudo port_cutleaves


MacPorts 1.9.0 fügte das hinzusqlite portdbformat und MacPorts 2.0.0 flatlöschte das alte Format . Das sqlitePort-DB-Format ist die Standardeinstellung für Neuinstallationen. Alte Installationen, die auf 1.9.x aktualisiert wurden, verwenden weiterhin das flatFormat 1 . Sie können eine 1.9.x konvertieren flatSystem auf den sqlitedurch ein Upgrade auf MacPorts 2.0 oder durch Änderung des portdbformatFormatwert in /opt/local/etc/macports/macports.confund dann Ausgeben einen Port - Befehls als Root (z sudo port installed).

Eines der Merkmale des neuen Formats ist, dass es die "angeforderten" im Vergleich zu "nicht angeforderten" Portinstallationen verfolgt. Ein nicht angeforderter Port wurde nur installiert, weil ein anderer Port davon abhängt. Der leavesPseudo-Portname wird auf alle nicht angeforderten Ports erweitert, von denen kein anderer installierter Port abhängt. Sie können diese Option verwenden, um nicht benötigte Ports zu bereinigen, auch wenn Sie sie ursprünglich nicht mit deinstalliert haben sudo port uninstall --follow-dependencies portname(was tun wird, was Sie wollen, aber nur, wenn Sie es bei jeder Deinstallation verwenden).


Sie sollten Ihre vorhandenen Blätter untersuchen, bevor Sie sie deinstallieren.

port echo leaves

Einige gemeinsamen Blätter ( automake, gperf, libtool, pkgconfig) sind build-Zeitabhängigkeiten von gemeinsamen Ports, so dass Sie möglicherweise auf „Anfrage“ , um sie ( sudo port setrequested port1 port2 port3 …) zu deinstallieren , sie zu vermeiden nur zu haben , um sie später erneut zu installieren.

Sie können alle verbleibenden Blätter ganz einfach deinstallieren:

sudo port uninstall leaves

Hinweis: Bevor Sie Ihre Blätter beschneiden, möchten Sie möglicherweise auch alte Versionen von Ports deinstallieren, die nicht mehr aktiv sind. Dies kann einige weitere Blätter aufdecken (dh Ports, die Abhängigkeiten von installierten, aber inaktiven Ports sind):

sudo port uninstall inactive

Es gibt mehrere Abschnitte in dem MacPorts Führer , die auch den Prozess beschreiben , die Verwendung von leavesnicht benötigten Ports zu deinstallieren.

Chris Johnsen
quelle
11
Vielen Dank. Das ist sehr hilfreich. Möglicherweise müssen Sie Echo-Blätter mehrmals hintereinander ausführen und deinstallieren, um sicherzustellen, dass alle Blätter gereinigt werden. Ich habe beide Befehle mindestens 4 Mal ausgeführt, bevor das Echo ein leeres Ergebnis
Antony
6
Man könnte so etwas sagen, um das while sudo port uninstall leaves; do :; donezu automatisieren.
Tom Anderson
2
@ChrisJohnsen sudo port uninstall --follow-dependents portnameist falsch, weil --follow-dependents"alle Ports, die vom angegebenen Port abhängen, rekursiv deinstalliert werden". Die richtige Option lautet hier: --follow-dependencies"Alle Ports, von denen der angegebene Port abhängig ist , werden rekursiv deinstalliert. Abhängigkeiten, die als angefordert gekennzeichnet sind oder andere abhängige Ports haben, werden dadurch nicht deinstalliert."
TachyonVortex
8

Aus den Dokumenten :

Die Deinstallationsaktion deinstalliert einen installierten Port.

%% sudo port uninstall vile Note

Verwenden Sie das ‑‑follow‑dependenciesFlag , um die Ports, von denen der angegebene Port abhängt, auch rekursiv zu deinstallieren . Dadurch werden keine Abhängigkeiten deinstalliert, die als angefordert markiert sind oder andere Abhängigkeiten aufweisen.

Um alle Ports, die vom angegebenen Port abhängen, rekursiv zu deinstallieren, bevor Sie den Port selbst deinstallieren, verwenden Sie die ‑‑follow‑dependents flag.

Wenn ein Port von einem anderen installierten Port abhängt, wird er bei der Deinstallation nur entfernt, wenn Sie zuerst die abhängigen Ports entfernen. Verwenden Sie die Option -f (force), um dieses Verhalten zu überschreiben. Dies wird offensichtlich die Angehörigen brechen. Erzwingen Sie keine Deinstallation von Ports, es sei denn, Sie wissen, was Sie tun.

%% sudo port -f uninstall vile

Beachten Sie die wichtigsten Vorsichtsmaßnahmen im letzten Absatz. Abhängigkeiten sind genau das - Abhängigkeiten - und verschiedene Apps können (werden) die gleichen Abhängigkeiten erfordern.

Philip Regan
quelle
Ich glaube nicht, dass dies die Frage beantwortet. Das OP möchte ein Programm und die Dinge, die es benötigt, entfernen, nicht ein Programm und die Dinge, die es benötigt.
2
@mankoff: ‑‑follow‑dependenciesvs. ‑‑follow‑dependents; Die zitierte Passage beschreibt beide, aber nur die erste gilt für die Frage
Chris Johnsen
3
Persönlich finde ich es großartig, dass Philip beide Parameter erklärt. Wir sind uns also der Parameter und ihrer Auswirkungen auf die Erteilung eines solchen Befehls voll bewusst
Antony,
3

Der Befehl zum Entfernen eines Ports und seiner abhängigen Komponenten lautet:

sudo port uninstall foo --follow-dependents

Wenn der zu deinstallierende Port jedoch abhängige Komponenten hat, wird er nicht ohne das -fFlag (force) deinstalliert .

Beginnen Sie natürlich mit dem Lesen des MacPorts-Handbuchs, indem Sie den Abschnitt Deinstallationshandbuch lesen .

Andrei Freeman
quelle
3

Das Contrib-Verzeichnis von MacPorts enthält auch ein Skript namens port_cutleaves, mit dem Sie nicht benötigte Abhängigkeiten entfernen können: http://trac.macports.org/browser/contrib/ . Sie werden nach jedem zu deinstallierenden Port gefragt und können einige behalten, falls Sie dies möchten.

Clemens Lang
quelle
2

Ich habe einige Skripte geschrieben, um die Portbereinigung zu automatisieren: https://github.com/vasi/macports-tools

Das 'macportsfoster'-Skript gibt eine Liste aller Ports aus, die von nichts in der angeforderten Liste benötigt werden. Die Reihenfolge ist so, dass' port disable $ (macportsfoster) 'alle Ports auf einmal entfernt.

vasi
quelle
1

Ich denke, die anderen Antworten und die --follow-dependentsFlagge tun nicht, was Sie wollen. Wenn Sie installieren Aund Abenötigen B, dann werden dank der wunderbaren Paketverwaltungssysteme Bdiese für Sie installiert. Sie können deinstallieren Bund das --follow-dependentsFlag wird erkannt und entfernt A. Aber was ist, wenn Sie deinstallieren A, was wahrscheinlicher ist, weil Adas, was Sie manuell installiert haben, an erster Stelle steht? In diesem Fall Bbleibt zurück.

Wenn Sie fink verwenden, soll das debfoster- Paket Ihr System bereinigen und nicht verwendete Abhängigkeiten entfernen.

Debfoster hilft Ihnen dabei, Pakete (z. B. Bibliotheken) zu entfernen, die auf Ihrem System zurückbleiben, wenn das erforderliche Programm entfernt oder auf eine Version aktualisiert wurde, die keine Abhängigkeit aufweist.

Während debfosternicht für MacPorts arbeiten, scheint es Ports zu sein debfosterzum Beispiel, portsfosterobwohl es eingestellt zu sein scheint ...

Möglicherweise gibt es derzeit keine Lösung für MacPorts.


quelle
Aber ist Debfoster für Deb-Dateien nicht auf Debian-basierten Systemen? Wie verwende ich es für MacPorts-Ports unter Mac OS X?
HPY
Es wurde auf OS X portiert und MacPorts und Fink basieren auf dem aptvon Debian verwendeten System. Ich benutze keine MacPorts, aber ich habe einen gemacht fink install debfosterund es hat gut funktioniert für mich.
MacPorts ist nicht aptsystembezogen und verwendet keine debDateien. Die Idee von MacPorts ist mit FreeBSD-Ports oder NetBSD pkgsrc verwandt, aber die Implementierung ist sehr unterschiedlich.
Chris Johnsen
1
OKAY. Danke für die Korrektur. Unabhängig davon wurde Debfoster so portiert, dass es einwandfrei funktioniert fink. Weitere Suche zeigt, dass es nicht mit MacPorts funktioniert, aber es gibt Klone, zum Beispielportsfoster