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?
Para evitar cortar accidentalmente las hojas que podrían ser las cosas que solicitó, debe instalar el port_cutleaves
paquete 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 flat
formato anterior . El sqlite
formato de puerto DB es el predeterminado para nuevas instalaciones; las instalaciones antiguas que se actualizaron a 1.9.x continuarán utilizando el flat
formato 1 . Puede convertir un flat
sistema 1.9.x al sqlite
formato actualizando a MacPorts 2.0 o cambiando el portdbformat
valor /opt/local/etc/macports/macports.conf
y 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 leaves
seudopuerto 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 leaves
para desinstalar puertos innecesarios.
while sudo port uninstall leaves; do :; done
automatizar eso.sudo port uninstall --follow-dependents portname
es 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".De los documentos :
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.
fuente
‑‑follow‑dependencies
vs.‑‑follow‑dependents
; el pasaje citado describe ambos, pero solo el primero se aplica a la preguntaEl comando para eliminar un puerto y sus dependientes es:
Sin embargo, si el puerto que está desinstalando tiene dependientes, no se desinstalará sin el
-f
indicador (forzar).Por supuesto, debe comenzar leyendo la Guía de MacPorts buscando específicamente en la sección Guía de desinstalación.
fuente
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.
fuente
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.
fuente
Creo que las otras respuestas, y la
--follow-dependents
bandera, no hacen lo que quieres. Si lo instalaA
y loA
requiereB
, entonces gracias a los maravillosos sistemas de administración de paquetes,B
se instalará para usted. Puede desinstalarB
y la--follow-dependents
bandera se dará cuenta y eliminaráA
. Pero, ¿qué sucede si desinstalaA
, lo que es más probable, porqueA
es lo que instaló manualmente en primer lugar? En este caso,B
queda atrás.Si usa fink, el paquete debfoster está diseñado para limpiar su sistema y eliminar las dependencias no utilizadas.
Si bien
debfoster
no funcionará para MacPorts, parece haber puertos dedebfoster
, por ejemploportsfoster
, aunque parece estar descontinuado ...Quizás no exista una solución actualmente para MacPorts.
fuente
apt
sistema que utiliza Debian. No uso MacPorts, pero lo hicefink install debfoster
y funcionó bien para mí.apt
sistema y no utilizadeb
archivos. La idea de MacPorts está relacionada con los puertos FreeBSD o NetBSD pkgsrc, pero la implementación es muy diferente.fink
. La búsqueda adicional muestra que no funciona con MacPorts, pero hay clones, por ejemplo, consulteportsfoster