Comment supprimer les packages MacPorts inutilisés?

94

Chaque fois que j'installe un programme via MacPorts, il génère et installe de nombreuses dépendances. Lorsque je désinstalle ledit programme, comment puis-je faire en sorte que MacPorts supprime récursivement toutes les dépendances inutilisées?

hpy
la source

Réponses:

105

Pour éviter de couper accidentellement les feuilles que vous avez demandées, vous devez installer le port_cutleavespaquet, puis exécuter sudo port_cutleaves https://guide.macports.org/#using.common-tasks.keeplean.


MacPorts 1.9.0 a ajouté lesqlite portdbformat et MacPorts 2.0.0 a abandonné l'ancien flatformat . Le sqliteformat de la base de données de port est la valeur par défaut pour les nouvelles installations. les anciennes installations qui ont été mises à niveau vers 1.9.x continueront à utiliser le flatformat 1 . Vous pouvez convertir un flatsystème 1.9.x au sqliteformat en effectuant une mise à niveau vers MacPorts 2.0 ou en modifiant la portdbformatvaleur /opt/local/etc/macports/macports.confpuis en émettant une commande de port en tant que root (par exemple sudo port installed).

Une des caractéristiques du nouveau format est qu’il garde la trace des installations de port «demandées» par rapport aux installations «non demandées». Un port non demandé est un port qui n'a été installé que parce qu'un autre port en dépend. Le leavespseudo-portname s'étend à tous les ports non sollicités dont ne dépend aucun autre port installé. Vous pouvez l'utiliser pour «nettoyer» les ports inutiles, même si vous ne les avez pas désinstallés à l'origine sudo port uninstall --follow-dependencies portname(vous obtiendrez ce que vous voulez, mais seulement si vous pensez l'utiliser chaque fois que vous désinstallez quelque chose).


Vous devriez examiner vos feuilles existantes avant de désinstaller l'une d'elles.

port echo leaves

Quelques feuilles communes ( automake, gperf, libtool, pkgconfig) sont construire temps dépendances de ports communs, de sorte que vous voudrez peut - être « demande » les ( sudo port setrequested port1 port2 port3 …) pour éviter de les désinstaller juste pour les réinstaller plus tard.

Vous pouvez désinstaller les feuilles restantes assez facilement:

sudo port uninstall leaves

Remarque: Avant d'élaguer vos feuilles, vous pouvez également désinstaller les anciennes versions des ports qui ne sont plus «actifs». Cela peut révéler quelques feuilles supplémentaires (par exemple, les ports qui sont des dépendances des ports installés, mais inactifs):

sudo port uninstall inactive

Il y a plusieurs sections dans le Guide MacPorts qui décrivent également le processus d'utilisation leavesde désinstaller les ports non nécessaires.

Chris Johnsen
la source
11
Merci. Ceci est très utile. Il semble que vous deviez peut-être exécuter des feuilles d'écho et désinstaller des feuilles successivement pour vous assurer que toutes les feuilles sont nettoyées. J'ai exécuté les deux commandes au moins 4 fois avant que echo leaves ne retourne aucun résultat
Antony
6
Vous pourriez dire quelque chose comme while sudo port uninstall leaves; do :; doneautomatiser cela.
Tom Anderson
2
@ChrisJohnsen sudo port uninstall --follow-dependents portnameest incorrect, car --follow-dependents"désinstallera de manière récursive tous les ports qui dépendent du port spécifié". L'option correcte est --follow-dependencies"désinstaller récursivement tous les ports dont dépend le port spécifié. Cela ne désinstallera pas les dépendances marquées comme étant demandées ou ayant d'autres personnes à charge".
TachyonVortex
8

De la docs :

L'action de désinstallation désinstallera un port installé.

%% sudo port uninstall vile Note

Pour désinstaller également de manière récursive les ports dont dépend le port donné, utilisez l' ‑‑follow‑dependenciesindicateur. Cela ne désinstallera pas les dépendances marquées comme étant demandées ou ayant d'autres dépendants.

Pour désinstaller de manière récursive tous les ports qui dépendent du port donné avant de désinstaller le port lui-même, utilisez le fichier ‑‑follow‑dependents flag.

Si un port est une dépendance d'un autre port installé, la désinstallation ne le supprimera pas, sauf si vous supprimez d'abord le ou les ports dépendants. Pour remplacer ce comportement, utilisez le commutateur -f (force). Cela va évidemment briser les personnes à charge. Ne forcez pas les ports de désinstallation à moins de savoir ce que vous faites.

%% sudo port -f uninstall vile

Notez la mise en garde majeure dans le dernier paragraphe. Les dépendances sont exactement cela - des dépendances - et différentes applications peuvent nécessiter les mêmes dépendances.

Philip Regan
la source
Je ne pense pas que cela réponde à la question. Le PO veut supprimer un programme et les éléments dont il a besoin, pas un programme et les éléments qui le nécessitent.
2
@mankoff: ‑‑follow‑dependenciesvs ‑‑follow‑dependents; le passage cité décrit les deux, mais seul le premier s'applique à la question
Chris Johnsen Le
3
Personnellement, je pense que c’est formidable que Philip explique les deux paramètres, nous sommes donc pleinement conscients de ces paramètres et de leurs implications lors de l’émission de cette commande
Antony
3

La commande pour supprimer un port et ses dépendants est la suivante:

sudo port uninstall foo --follow-dependents

Toutefois, si le port que vous désinstallez a des personnes à charge, il ne sera pas désinstallé sans l' -findicateur (force).

Bien sûr, vous devriez commencer par lire le Guide MacPorts en consultant plus particulièrement la section du guide de désinstallation.

Andrei Freeman
la source
3

Il existe également un script dans le répertoire contrib de MacPorts appelé port_cutleaves que vous pouvez exécuter pour supprimer les dépendances inutiles: http://trac.macports.org/browser/contrib/ . Il vous demandera chaque port à désinstaller et vous permettra d'en conserver, si vous le souhaitez.

Clemens Lang
la source
2

J'ai écrit quelques scripts pour automatiser le nettoyage du port: https://github.com/vasi/macports-tools

Le script 'macportsfoster' produira une liste de tous les ports non requis par un élément quelconque de la liste demandée, ordonnée de telle sorte que 'le port désactiver $ (macportsfoster)' les supprimera tous d'un coup.

vasi
la source
1

Je pense que les autres réponses, et le --follow-dependentsdrapeau, ne font pas ce que vous voulez. Si vous installez Aet Anécessite B, alors, grâce aux merveilleux systèmes de gestion de paquets, Bsera installé pour vous. Vous pouvez désinstaller Bet le --follow-dependentsdrapeau sera au courant et à supprimer A. Mais que se passe-t-il si vous désinstallez A, ce qui est plus probable, car Aest ce que vous avez manuellement installé en premier lieu? Dans ce cas, Best laissé pour compte.

Si vous utilisez fink, le paquet debfoster est conçu pour nettoyer votre système et supprimer les dépendances inutilisées.

Debfoster vous aidera à vous débarrasser des paquets (les bibliothèques par exemple) de rester sur votre système lorsque le programme qui le nécessitait a été supprimé ou mis à niveau vers une version ne dépendant pas de la dépendance.

Bien que debfostercela ne fonctionne pas pour MacPorts, il semble y avoir des ports de debfoster, par exemple portsfoster, bien qu'il semble avoir été interrompu ...

Peut-être qu’aucune solution n’existe actuellement pour MacPorts.


la source
Mais debfoster n'est-il pas pour les fichiers deb sur un système basé sur Debian? Comment l'utiliser pour les ports MacPorts sous Mac OS X?
hpy
Il a été porté sur OS X et MacPorts et fink est basé sur le aptsystème utilisé par Debian. Je n'utilise pas MacPorts, mais j'en ai fait un fink install debfosteret cela a bien fonctionné pour moi.
MacPorts n'est pas lié au aptsystème et n'utilise pas de debfichiers. L'idée de MacPorts est liée aux ports FreeBSD ou à NetBSD pkgsrc, mais la mise en œuvre est très différente.
Chris Johnsen
1
D'ACCORD. Merci pour la correction. Quoi qu'il en soit, debfoster a été porté pour fonctionner correctement fink. Une recherche plus poussée montre que cela ne fonctionne pas avec MacPorts, mais il existe des clones, par exemple, voirportsfoster