Como remover pacotes MacPorts não utilizados?

94

Sempre que instalo um programa via MacPorts, ele obtém e instala muitas dependências. Quando desinstalo o referido programa, como faço para o MacPorts remover recursivamente todas as dependências não utilizadas?

hpy
fonte

Respostas:

105

Para evitar o corte acidental de folhas solicitadas, instale o port_cutleavespacote e execute sudo port_cutleaves https://guide.macports.org/#using.common-tasks.keeplean


O MacPorts 1.9.0 adicionou osqlite portdbformat e o MacPorts 2.0.0 abandonou o flatformato antigo . O sqliteformato do banco de dados da porta é o padrão para novas instalações; instalações antigas que foram atualizadas para 1.9.x continuarão usando o flatformato 1 . Você pode converter um flatsistema 1.9.x no sqliteformato atualizando para o MacPorts 2.0 ou alterando o portdbformatvalor /opt/local/etc/macports/macports.confe emitindo um comando port como root (por exemplo sudo port installed).

Um dos recursos do novo formato é que ele monitora as instalações de portas "solicitadas" versus "não solicitadas". Uma porta não solicitada é aquela que foi instalada apenas porque outra porta depende dela. O leavespseudo-portname se expande para todas as portas não solicitadas das quais nenhuma outra porta instalada depende. Você pode usar isso para "limpar" portas desnecessárias, mesmo que não as tenha desinstalado originalmente sudo port uninstall --follow-dependencies portname(o que fará o que você deseja, mas apenas se você lembrar de usá-lo sempre que desinstalar algo).


Você deve examinar as folhas existentes antes de desinstalar qualquer uma delas.

port echo leaves

Algumas folhas comuns ( automake, gperf, libtool, pkgconfig) são construídas em tempo dependências de portas comuns, assim você pode querer “pedido” eles ( sudo port setrequested port1 port2 port3 …) para evitar a desinstalação-los apenas para ter que reinstalá-los mais tarde.

Você pode desinstalar qualquer folha restante com bastante facilidade:

sudo port uninstall leaves

Nota: Antes de remover suas folhas, convém desinstalar versões antigas de portas que não estão mais "ativas". Isso pode revelar mais algumas folhas (ou seja, portas dependentes de portas instaladas, mas inativas):

sudo port uninstall inactive

Existem várias seções no Guia MacPorts que também descrevem o processo de leavesdesinstalação de portas desnecessárias.

Chris Johnsen
fonte
11
Obrigado. Isso é bastante útil. Parece que você pode precisar executar as folhas de eco e desinstalá-las várias vezes para garantir que todas as folhas estejam limpas. Corri comanda tanto pelo menos 4 vezes antes de eco folhas retornar resultados vazio
Antony
6
Você poderia dizer algo como while sudo port uninstall leaves; do :; doneautomatizar isso.
Tom Anderson
2
@ChrisJohnsen sudo port uninstall --follow-dependents portnameestá incorreto porque --follow-dependents"desinstalará recursivamente todas as portas que dependem da porta especificada". A opção correta aqui é --follow-dependencies: "desinstalará recursivamente todas as portas das quais a porta especificada dependia. Isso não desinstalará dependências marcadas como solicitadas ou que tenham outros dependentes".
TachyonVortex
8

Dos documentos :

A ação de desinstalação desinstalará uma porta instalada.

%% sudo port uninstall vile Note

Para também desinstalar recursivamente as portas das quais a porta especificada depende, use o ‑‑follow‑dependenciessinalizador. Isso não desinstalará dependências marcadas como solicitadas ou que tenham outros dependentes.

Para desinstalar recursivamente todas as portas que dependem da porta especificada antes de desinstalar a própria porta, use o ‑‑follow‑dependents flag.

Se uma porta for uma dependência de outra porta instalada, a desinstalação não a removerá, a menos que você remova primeiro a (s) porta (s) dependente (s). Para substituir esse comportamento, use a opção -f (force). Obviamente, isso quebrará os dependentes. Não force as portas de desinstalação, a menos que você saiba o que está fazendo.

%% sudo port -f uninstall vile

Observe a ressalva principal no último parágrafo. Dependências são exatamente isso - dependências - e aplicativos diferentes podem (vão) exigir as mesmas dependências.

Philip Regan
fonte
Eu não acho que isso responda à pergunta. O OP quer remover um programa e tudo o que ele exige, não remover um programa e tudo o que ele exige.
2
@mankoff: ‑‑follow‑dependenciesvs ‑‑follow‑dependents; a passagem citada descreve ambos, mas apenas o primeiro se aplica à questão
Chris Johnsen
3
Pessoalmente, acho ótimo que Philip explique os dois parâmetros, por isso estamos plenamente cientes dos parâmetros e de suas implicações ao emitir esse comando.
Antony
3

O comando para remover uma porta e seus dependentes é:

sudo port uninstall foo --follow-dependents

No entanto, se a porta que você está desinstalando tiver dependentes, ela não será desinstalada sem o -fsinalizador (force).

Claro que você deve começar lendo o Guia MacPorts, olhando especificamente para a seção Guia de desinstalação.

Andrei Freeman
fonte
3

Há também um script no diretório contrib do MacPorts chamado port_cutleaves que você pode executar para remover dependências desnecessárias: http://trac.macports.org/browser/contrib/ . Ele solicitará cada porta a ser desinstalada e permitirá manter algumas, caso você queira.

Clemens Lang
fonte
2

Escrevi alguns scripts para automatizar a limpeza de portas: https://github.com/vasi/macports-tools

O script 'macportsfoster' exibirá uma lista de todas as portas não exigidas por nada da lista solicitada, ordenada de forma que 'port deactivate $ (macportsfoster)' remova todas elas de uma só vez.

vasi
fonte
1

Acho que as outras respostas e a --follow-dependentsbandeira não fazem o que você deseja. Se você instalar Ae Aexigir B, graças aos maravilhosos sistemas de gerenciamento de pacotes, Bserá instalado para você. Você pode desinstalar Be o --follow-dependentssinalizador estará ciente e remover A. Mas e se você desinstalar A, o que é mais provável, porque Aé o que você instalou manualmente em primeiro lugar? Neste caso, Bé deixado para trás.

Se você usa o fink, o pacote debfoster foi projetado para limpar seu sistema e remover dependências não utilizadas.

O Debfoster irá ajudá-lo a se livrar dos pacotes (bibliotecas, por exemplo), deixados para trás no seu sistema quando o programa que exigia que ele fosse removido ou atualizado para uma versão que não tivesse dependência.

Embora debfosternão funcione para MacPorts, parece haver portas debfoster, por exemplo portsfoster, embora pareçam ser descontinuadas ...

Talvez não exista atualmente nenhuma solução para o MacPorts.


fonte
Mas não é debfoster para arquivos deb no sistema baseado no Debian? Como uso para portas MacPorts no Mac OS X?
Hp
Foi portado para o OS X e o MacPorts e o fink é baseado no aptsistema usado pelo Debian. Eu não uso MacPorts, mas fiz um fink install debfostere funcionou muito bem para mim.
O MacPorts não está relacionado ao aptsistema e não usa debarquivos. A idéia do MacPorts está relacionada às portas do FreeBSD ou NetBSD pkgsrc, mas a implementação é muito diferente.
precisa
1
ESTÁ BEM. Obrigado pela correção. Independentemente disso, o debfoster foi portado para funcionar bem fink. Além disso a pesquisa mostra que ele não trabalhar com MacPorts, mas existem clones, por ex, consulteportsfoster