¿Cómo eliminar los paquetes MacPorts no utilizados?

94

Cada vez que instalo un programa a través de MacPorts, obtiene e instala muchas dependencias. Cuando desinstalo dicho programa, ¿cómo hago para que MacPorts elimine recursivamente todas las dependencias no utilizadas?

hpy
fuente

Respuestas:

105

Para evitar cortar accidentalmente las hojas que podrían ser las cosas que solicitó, debe instalar el port_cutleavespaquete y luego ejecutar sudo port_cutleaves https://guide.macports.org/#using.common-tasks.keeplean


MacPorts 1.9.0 agregósqlite portdbformat y MacPorts 2.0.0 eliminó el flatformato anterior . El sqliteformato de puerto DB es el predeterminado para nuevas instalaciones; las instalaciones antiguas que se actualizaron a 1.9.x continuarán utilizando el flatformato 1 . Puede convertir un flatsistema 1.9.x al sqliteformato actualizando a MacPorts 2.0 o cambiando el portdbformatvalor /opt/local/etc/macports/macports.confy luego emitiendo un comando de puerto como root (por ejemplo sudo port installed).

Una de las características del nuevo formato es que realiza un seguimiento de las instalaciones portuarias "solicitadas" versus "no solicitadas". Un puerto no solicitado es uno que solo se instaló porque otro puerto depende de él. El leavesseudopuerto se expande a todos los puertos no solicitados de los que no depende ningún otro puerto instalado. Puede usar esto para "limpiar" los puertos innecesarios incluso si no los desinstaló originalmente sudo port uninstall --follow-dependencies portname(lo que hará lo que quiera, pero solo si recuerda usarlo cada vez que desinstala algo).


Debe examinar sus hojas existentes antes de desinstalar cualquiera de ellas.

port echo leaves

Algunas hojas comunes ( automake, gperf, libtool, pkgconfig) son construir en tiempo dependencias de los puertos comunes, por lo que puede “solicitar” ellos ( sudo port setrequested port1 port2 port3 …) para evitar la desinstalación de ellos sólo para tener que volver a instalar más tarde.

Puede desinstalar las hojas restantes con bastante facilidad:

sudo port uninstall leaves

Nota: Antes de podar las hojas, es posible que también desee desinstalar versiones antiguas de puertos que ya no están "activas". Esto puede revelar algunas hojas más (es decir, puertos que son dependencias de puertos que están instalados, pero inactivos):

sudo port uninstall inactive

Hay varias secciones en la Guía de MacPorts que también describen el proceso de uso leavespara desinstalar puertos innecesarios.

Chris Johnsen
fuente
11
Gracias. Esto es bastante útil. Parece que puede que tenga que ejecutar hojas de eco y desinstalar hojas una y otra vez para asegurarse de que todas las hojas estén limpias. Ejecuté ambos comandos al menos 4 veces antes de que las hojas de eco devuelvan un resultado vacío
Antony
66
Se podría decir algo así como while sudo port uninstall leaves; do :; doneautomatizar eso.
Tom Anderson
2
@ChrisJohnsen sudo port uninstall --follow-dependents portnamees incorrecto porque --follow-dependents"desinstalará recursivamente todos los puertos que dependen del puerto especificado". La opción correcta aquí es --follow-dependencies, que "desinstalará recursivamente todos los puertos de los que dependía el puerto especificado. Esto no desinstalará las dependencias que están marcadas como solicitadas o que tienen otras dependencias".
TachyonVortex
8

De los documentos :

La acción de desinstalación desinstalará un puerto instalado.

%% sudo port uninstall vile Note

Para desinstalar también recursivamente los puertos de los que depende el puerto dado, use el ‑‑follow‑dependenciesindicador. Esto no desinstalará las dependencias que están marcadas como solicitadas o que tienen otras dependientes.

Para desinstalar recursivamente todos los puertos que dependen del puerto dado antes de desinstalar el puerto, use el ‑‑follow‑dependents flag.

Si un puerto es una dependencia de otro puerto instalado, la desinstalación no lo eliminará a menos que primero elimine los puertos dependientes. Para anular este comportamiento, use el modificador -f (force). Obviamente, esto romperá a los dependientes. No fuerce los puertos de desinstalación a menos que sepa lo que está haciendo.

%% sudo port -f uninstall vile

Tenga en cuenta la advertencia principal en el último párrafo. Las dependencias son exactamente eso, dependencias, y diferentes aplicaciones pueden (requerirán) las mismas dependencias.

Philip Regan
fuente
No creo que esto responda la pregunta. El OP quiere eliminar un programa y las cosas que requiere, no eliminar un programa y las cosas que lo requieren.
2
@mankoff: ‑‑follow‑dependenciesvs. ‑‑follow‑dependents; el pasaje citado describe ambos, pero solo el primero se aplica a la pregunta
Chris Johnsen,
3
Personalmente, creo que es genial que Philip explique ambos parámetros, por lo que somos plenamente conscientes de los parámetros y sus implicaciones al emitir dicho comando
Antony
3

El comando para eliminar un puerto y sus dependientes es:

sudo port uninstall foo --follow-dependents

Sin embargo, si el puerto que está desinstalando tiene dependientes, no se desinstalará sin el -findicador (forzar).

Por supuesto, debe comenzar leyendo la Guía de MacPorts buscando específicamente en la sección Guía de desinstalación.

Andrei Freeman
fuente
3

También hay un script en el directorio contrib de MacPorts llamado port_cutleaves que puede ejecutar para eliminar dependencias innecesarias: http://trac.macports.org/browser/contrib/ . Le pedirá cada puerto a desinstalar y le permitirá conservar algunos, si así lo desea.

Clemens Lang
fuente
2

He escrito algunos scripts para automatizar la limpieza de puertos: https://github.com/vasi/macports-tools

El script 'macportsfoster' generará una lista de todos los puertos no requeridos por nada en la lista solicitada, ordenada de tal manera que 'port deactivate $ (macportsfoster)' los eliminará a todos de una sola vez.

vasi
fuente
1

Creo que las otras respuestas, y la --follow-dependentsbandera, no hacen lo que quieres. Si lo instala Ay lo Arequiere B, entonces gracias a los maravillosos sistemas de administración de paquetes, Bse instalará para usted. Puede desinstalar By la --follow-dependentsbandera se dará cuenta y eliminará A. Pero, ¿qué sucede si desinstala A, lo que es más probable, porque Aes lo que instaló manualmente en primer lugar? En este caso, Bqueda atrás.

Si usa fink, el paquete debfoster está diseñado para limpiar su sistema y eliminar las dependencias no utilizadas.

Debfoster lo ayudará a deshacerse de los paquetes (bibliotecas, por ejemplo) que quedan en su sistema cuando el programa que lo requirió fue eliminado o actualizado a una versión que no tiene la dependencia.

Si bien debfosterno funcionará para MacPorts, parece haber puertos de debfoster, por ejemplo portsfoster, aunque parece estar descontinuado ...

Quizás no exista una solución actualmente para MacPorts.


fuente
¿Pero no es debfoster para archivos deb en el sistema basado en Debian? ¿Cómo lo uso para puertos MacPorts en Mac OS X?
hpy
Se ha portado a OS X y MacPorts y Fink se basa en el aptsistema que utiliza Debian. No uso MacPorts, pero lo hice fink install debfostery funcionó bien para mí.
MacPorts no está relacionado con el aptsistema y no utiliza debarchivos. La idea de MacPorts está relacionada con los puertos FreeBSD o NetBSD pkgsrc, pero la implementación es muy diferente.
Chris Johnsen
1
OKAY. Gracias por la corrección. De todos modos, debfoster ha sido portado para funcionar bien fink. La búsqueda adicional muestra que no funciona con MacPorts, pero hay clones, por ejemplo, consulteportsfoster