Desinstalar / remover um pacote Homebrew incluindo todas as suas dependências

339

Eu tenho um Homebrew fórmula que desejo desinstalar / remover junto com todas as suas dependências, ignorando os pacotes dos quais outros pacotes dependem (também conhecido como remoção de pacotes em cascata na linguagem do gerenciador de pacotes).

por exemplo, desinstalar o pacote aque depende dos pacotes be c, onde o pacote dtambém depende do pacote c. O resultado deve desinstalar o a&b , ignorando c.

Como eu posso fazer isso?

Deve haver uma maneira de desinstalar um pacote sem deixar lixo desnecessário para trás.

Ory Band
fonte
3
Não é isso que qualquer gerenciador de pacotes, que vale esse nome, deve fazer imediatamente? LOL
mljrg 26/09/19

Respostas:

407

EDITAR:

Parece que o problema agora foi resolvido usando um comando externo chamado brew rmdepsoubrew rmtree .

Para instalar e usar, emita os seguintes comandos:

$ brew tap beeftornado/rmtree
$ brew rmtree <package>

Veja o link acima para mais informações e discussão.


Resposta original:

Parece que, atualmente, não há uma maneira fácil de fazer isso.

No entanto, eu arquivei um problema na página do Homebrew no GitHub e alguém sugeriu uma solução temporária até adicionar um comando exclusivo para resolver isso.

Existe um comando externo chamado brew leavesque imprime todos os pacotes que não são dependências de outros pacotes.

Se você fizer uma saída lógica e na saída de brew leavese brew deps <package>, poderá obter apenas uma lista dos pacotes de dependências órfãs, que poderão ser desinstalados manualmente posteriormente. Combine isso xargse você terá o que precisa, eu acho (não testado, não conte com isso).


EDIT: Alguém acabou de sugerir uma solução muito semelhante, usando em joinvez de xargs:

brew rm FORMULA
brew rm $(join <(brew leaves) <(brew deps FORMULA))

Veja o comentário sobre o problema mencionado acima para obter mais informações.

Ory Band
fonte
4
Segunda linha dá um erro: This command requires a keg argument.
Shmidt
7
O brew rmtreescript de terceiros está agora disponível em um toque:brew tap beeftornado/rmtree && brew install beeftornado/rmtree/brew-rmtree
Nick McCurdy 23/11
11
@NicolasMcCurdy Eu tentei e posso confirmar que essa é realmente a maneira mais conveniente hoje em dia.
Ory Banda
11
brew rm $(join <(brew leaves) <(brew deps FORMULA))faz bem o trabalho. Você só precisa executá-lo repetidamente até que todas as dependências sejam removidas. Ele não pode desinstalar tudo de uma vez, porque as dependências são interdependentes.
Greg Wang
11
O && brew install brew-rmtreenão é mais necessário.
Boris
34

O objetivo aqui é remover o pacote fornecido e suas dependências sem interromper as dependências de outro pacote. Eu uso este comando:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | xargs brew install

Nota: Editado para refletir o comentário útil de @ alphadogg.

jfmercer
fonte
Tinha que adicionar --ignore-dependenciespara remover para permitir que isso funcionasse.
alphadogg
2
Isso quebrou minha configuração de preparação, pois não reinstalou os deps usados ​​em outros pacotes. NÃO UTILIZAR
Marco Pappalardo
25

brew rmtree não funciona de todo . A partir dos links sobre esse problema, encontrei o rmrec que realmente funciona. Deus sabe por brewque não tem isso como um comando nativo.

brew tap ggpeti/rmrec
brew rmrec pkgname
Timmmm
fonte
Realmente adore isso, embora se você já começou a desinstalar a si mesmo e continua encontrando mais pacotes que precisa remover, ainda precisa saber quais são os pacotes mais amplos que podem [FORMULA]ser tocados ou pode apenas reinstalar brevemente o e usar rmrec remover recursivamente todas as suas dependências corretamente.
precisa saber é o seguinte
2
Advertência: Atualmente, também parece rmrecque não lida muito bem com pacotes com namespace. Eu estava usando algo que puxou linuxbrew/xorg/xorge ele removeu tudo, exceto esse pacote, e mesmo nomeando explicitamente esse pacote, ele não conseguiu resolvê-lo e não fez nada.
dragon788
Confirmou que a recomendação de uso rmrecé ruim. Ele não lida com dependências.
Omdv
Você quer dizer rmtree? rmreclida com dependências.
Timmmm
11
God knows why brew doesn't have this as a native command.=> Porque os desenvolvedores de cerveja têm atitudes ruins. Eles nem permitem que as pessoas abram problemas. Verifique github.com/Homebrew/brew , agora só há menos de 20 problemas. Um número tão pequeno. Isso é uma coisa boa? Não, é muito ruim.
precisa saber é o seguinte
15

Com base na resposta @jfmercer (as correções precisavam mais do que um comentário).

Remova as dependências do pacote (não remove o pacote):

brew deps [FORMULA] | xargs brew remove --ignore-dependencies

Remova o pacote:

brew remove [FORMULA]

Reinstale as bibliotecas ausentes:

brew missing | cut -d: -f2 | sort | uniq | xargs brew install

Desinstalação testada melddepois de descobrir as versões do MeldMerge .

cofre
fonte
Eu instalei o ffmpeg com o brew, o que estragou bastante as coisas. Limpar o ffmpeg, incluindo sua lista estendida de dependências, com o método descrito acima, funcionou para mim.
webtweakers
13

O uso desta resposta requer que você crie e mantenha um arquivo que contenha os nomes dos pacotes que você deseja instalar no seu sistema. Se você ainda não possui um, use o comando a seguir e exclua os nomes dos pacotes que não deseja manter instalados.

brew leaves > brew_packages

Em seguida, você pode remover todos os pacotes instalados, mas indesejados, e quaisquer dependências desnecessárias executando o seguinte comando

brew_clean brew_packages

brew_clean está disponível aqui: https://gist.github.com/cskeeters/10ff1295bca93808213d

Esse script obtém todos os pacotes especificados em brew_packages e todas as suas dependências e os compara com a saída de brew list e, finalmente, remove os pacotes indesejados depois de verificar esta lista com o usuário.

Nesse ponto, se você deseja remover o pacote a, basta removê-lo do arquivo brew_packages e executar novamente brew_clean brew_packages. Irá removerb , mas não c.

Chade Skeeters
fonte
Eu acho que o brew clean já está embutido, tente #brew clean -s
Devin G Rhode
11
O comentário acima estava errado, a edição é interrompida em 5 minutos. tentebrew cleanup -s && brew cask cleanup
Devin G Rhode
5

Você pode apenas usar um canal UNIX para este

brew deps [FORMULA] | xargs brew rm
shapeshed
fonte
12
Esta não é uma boa solução. Você pode quebrar as dependências de outros pacotes dessa maneira.
Ory Banda
12
Há um comando que pode ser executado depois de lhe dizer se você nukado quaisquer outras dependências necessárias brew missingque lhe dirá o que vos mando precisa correr para recuperá-los
SeanJA
4

Salve o seguinte script como eliminação de infusão

#!/bin/bash
#:Usage: brew purge formula
#: 
#:Removes the package and all dependancies.
#: 
#: 
PKG="$1"
if [ -z "$PKG" ];then
   brew purge --help
   exit 1
fi
brew rm $PKG
[ $? -ne 0 ] && exit 1
while brew rm $(join <(brew leaves) <(brew deps $PKG)) 2>/dev/null
  do :
done
echo Package $PKG and its dependancies have been removed.
exit 0

Agora instale-o com o seguinte comando

sudo install brew-purge /usr/local/bin

Agora corra

brew purge package

Exemplo usando gpg

$ brew purge gpg
Uninstalling /usr/local/Cellar/gnupg/2.2.13... (134 files, 11.0MB)
Uninstalling /usr/local/Cellar/adns/1.5.1... (14 files, 597.5KB)
Uninstalling /usr/local/Cellar/gnutls/3.6.6... (1,200 files, 8.9MB)
Uninstalling /usr/local/Cellar/libgcrypt/1.8.4... (21 files, 2.6MB)
Uninstalling /usr/local/Cellar/libksba/1.3.5... (14 files, 344.2KB)
Uninstalling /usr/local/Cellar/libusb/1.0.22... (29 files, 508KB)
Uninstalling /usr/local/Cellar/npth/1.6... (11 files, 71.7KB)
Uninstalling /usr/local/Cellar/pinentry/1.1.0_1... (12 files, 263.9KB)
Uninstalling /usr/local/Cellar/libassuan/2.5.3... (16 files, 444.2KB)
Uninstalling /usr/local/Cellar/libtasn1/4.13... (59 files, 436KB)
Uninstalling /usr/local/Cellar/libunistring/0.9.10... (54 files, 4.4MB)
Uninstalling /usr/local/Cellar/nettle/3.4.1... (85 files, 2MB)
Uninstalling /usr/local/Cellar/p11-kit/0.23.15... (63 files, 2.9MB)
Uninstalling /usr/local/Cellar/gmp/6.1.2_2... (18 files, 3.1MB)
Uninstalling /usr/local/Cellar/libffi/3.2.1... (16 files, 296.8KB)
Uninstalling /usr/local/Cellar/libgpg-error/1.35... (27 files, 854.8KB)
Package gpg and its dependancies have been removed.
$ 
Kevin Davies
fonte
2

Outras respostas não funcionaram para mim, mas isso funcionou (com fishcasca):

brew remove <package>
for p in (brew deps <package>)
    brew remove $p
end

Porque brew remove $pfalha quando outro pacote depende p.

Luke Miles
fonte
2

Uma função Bourne Shell mais completa

Já existem várias respostas boas, mas algumas estão desatualizadas e nenhuma delas está completa. Em particular, a maioria deles removerá dependências, mas ainda assim você poderá remover a fórmula segmentada originalmente posteriormente. Os one-liners publicados também podem ser entediantes, se você deseja desinstalar mais de uma fórmula por vez.

Aqui está uma função de shell compatível com Bourne (sem Bashisms conhecidos) que pega uma lista de fórmulas, remove as dependências de cada um, remove todas as cópias da própria fórmula e depois reinstala as dependências ausentes.

unbrew () {
    local formula
    for formula in "$@"; do
        brew deps "$formula" |
        xargs brew uninstall --ignore-dependencies --force
        brew uninstall --force "$formula"
    done
    brew missing | cut -f2 -d: | sort -u | xargs brew install
}

Foi testado no Homebrew 1.7.4.

Ressalvas

Isso funciona em todas as fórmulas padrão que eu testei. Atualmente, ele não lida com barris, mas também não se queixará em voz alta se você tentar abrir um barril com o mesmo nome que uma fórmula padrão (por exemplo, MacVim).

Todd A. Jacobs
fonte
1

A resposta de @jfmercer deve ser ligeiramente modificada para funcionar com a distribuição atual, porque a saída de brew missingmudou:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install
freytag
fonte