Copot instalasi / hapus paket Homebrew termasuk semua dependensinya


339

Saya memiliki formula Homebrew yang ingin saya hapus / hapus beserta semua dependensinya, melewatkan paket yang menjadi sandaran paket lain (alias penghapusan paket Cascading dalam bahasa manajer paket).

misalnya paket Uninstall ayang tergantung pada paket b& c, di mana paket djuga tergantung pada paket c. Hasilnya harus mencopot keduanya a& b, lewati c.

Bagaimana saya bisa melakukan itu?

Pasti ada cara untuk menghapus paket tanpa meninggalkan sampah yang tidak perlu .


3
Bukankah ini yang harus dilakukan oleh manajer paket, sepadan dengan nama ini,? LOL
mljrg

Jawaban:


407

EDIT:

Sepertinya masalah sekarang diselesaikan dengan menggunakan perintah eksternal yang disebut brew rmdepsataubrew rmtree .

Untuk menginstal dan menggunakan, jalankan perintah berikut:

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

Lihat tautan di atas untuk informasi dan diskusi lebih lanjut.


Jawaban asli:

Tampaknya saat ini, tidak ada cara mudah untuk mencapai ini.

Namun, saya mengajukan masalah pada halaman GitHub Homebrew , dan seseorang menyarankan solusi sementara sampai mereka menambahkan perintah eksklusif untuk menyelesaikannya.

Ada perintah eksternal yang disebut brew leavesyang mencetak semua paket yang bukan dependensi dari paket lain.

Jika Anda melakukan logis dan pada output dari brew leavesdan brew deps <package>, Anda mungkin hanya mendapatkan daftar paket dependensi yatim, yang dapat Anda hapus secara manual setelahnya. Kombinasikan ini dengan xargsdan Anda akan mendapatkan apa yang Anda butuhkan, saya kira (belum diuji, jangan mengandalkan ini).


EDIT: Seseorang baru saja menyarankan solusi yang sangat mirip, menggunakan joinalih-alih xargs:

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

Lihat komentar tentang masalah yang disebutkan di atas untuk info lebih lanjut.


4
Baris kedua memberikan kesalahan: This command requires a keg argument.
Shmidt

7
brew rmtreeSkrip pihak ketiga sekarang tersedia dalam satu ketukan:brew tap beeftornado/rmtree && brew install beeftornado/rmtree/brew-rmtree
Nick McCurdy

1
@NicolasMcCurdy Saya sudah mencoba dan dapat mengkonfirmasi ini memang cara yang paling nyaman saat ini.
Ory Band

1
brew rm $(join <(brew leaves) <(brew deps FORMULA))melakukan pekerjaan dengan baik. Anda hanya perlu menjalankannya lagi dan lagi sampai semua dependensi dihapus. Itu tidak dapat menghapus semuanya sekaligus karena dependensi saling bergantung satu sama lain.
Greg Wang

1
Tidak && brew install brew-rmtreeperlu lagi.
Boris

34

Tujuannya di sini adalah untuk menghapus paket yang diberikan dan dependensinya tanpa memutus dependensi paket lain. Saya menggunakan perintah ini:

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

Catatan: Diedit untuk mencerminkan komentar bermanfaat @ alphadogg.


Harus menambahkan --ignore-dependenciesuntuk menghapus agar ini berfungsi.
alphadogg

2
Ini merusak konfigurasi minuman saya, karena tidak menginstal ulang deps yang digunakan dalam paket lain. JANGAN GUNAKAN
Marco Pappalardo

26

brew rmtree tidak bekerja sama sekali . Dari tautan pada masalah itu saya menemukan rmrec yang sebenarnya berfungsi. Tuhan tahu mengapa brewtidak memiliki ini sebagai perintah asli.

brew tap ggpeti/rmrec
brew rmrec pkgname

SANGAT MENYUKAINYA, meskipun jika Anda sudah memulai jalan menghapus instalan diri sendiri dan terus menemukan lebih banyak paket yang perlu Anda hapus, Anda masih perlu tahu paket apa yang paling menyentuh, atau Anda bisa menginstal ulang sebentar [FORMULA]lalu gunakan rmrec untuk menghapus semua dependensi itu secara rekursif dengan benar.
dragon788

2
Peringatan: Tampaknya juga rmrecsaat ini tidak menangani paket namespaced dengan sangat baik. Saya menggunakan sesuatu yang menarik linuxbrew/xorg/xorgdan menghapus semuanya kecuali paket itu dan bahkan secara eksplisit menyebutkan paket itu tidak dapat menyelesaikannya dan tidak melakukan apa pun.
dragon788

Mengonfirmasi bahwa rekomendasi untuk digunakan rmrecburuk. Itu tidak menangani ketergantungan sama sekali.
omdv

Maksudmu rmtree? rmrectidak menangani dependensi.
Timmmm

1
God knows why brew doesn't have this as a native command.=> Karena pengembang minuman memiliki sikap buruk. Mereka bahkan tidak mengizinkan orang untuk membuka masalah apa pun. Periksa github.com/Homebrew/brew , sekarang hanya ada kurang dari 20 masalah. Sejumlah kecil. Apakah itu hal yang baik? Tidak, ini sangat buruk.
sgon00

15

Berdasarkan jawaban @ jfmercer (koreksi diperlukan lebih dari komentar).

Hapus dependensi paket (tidak menghapus paket):

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

Hapus paket:

brew remove [FORMULA]

Instal ulang pustaka yang hilang:

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

Mencopot instalasi yang diuji meldsetelah menemukan rilis MeldMerge .


Saya telah menginstal ffmpeg dengan minuman, yang mengacaukan segalanya. Membersihkan ffmpeg, termasuk daftar dependensi yang diperluas, dengan metode yang dijelaskan di atas, bekerja untuk saya.
webtweakers

13

Menggunakan jawaban ini mengharuskan Anda membuat dan memelihara file yang berisi nama paket yang ingin Anda instal pada sistem Anda. Jika Anda belum memilikinya, gunakan perintah berikut dan hapus nama paket yang tidak ingin Anda instal.

brew leaves > brew_packages

Kemudian Anda dapat menghapus semua paket yang diinstal, tetapi paket yang tidak diinginkan dan dependensi yang tidak perlu dengan menjalankan perintah berikut

brew_clean brew_packages

brew_cleantersedia di sini: https://gist.github.com/cskeeters/10ff1295bca93808213d

Script ini mendapatkan semua paket yang Anda tentukan di brew_packages dan semua ketergantungannya dan membandingkannya dengan output brew listdan akhirnya menghapus paket yang tidak diinginkan setelah memverifikasi daftar ini dengan pengguna.

Pada titik ini jika Anda ingin menghapus paket a, Anda cukup menghapusnya dari file brew_packages kemudian jalankan kembali brew_clean brew_packages. Itu akan dihapus b, tetapi tidak c.


Saya pikir brew clean sudah ada sekarang, cobabrew clean -s
Devin G Rhode

1
KOMENTAR DI ATAS SALAH, penyuntingan terputus pada 5 menit. cobabrew cleanup -s && brew cask cleanup
Devin G Rhode

5

Anda bisa menggunakan pipa UNIX untuk ini

brew deps [FORMULA] | xargs brew rm

12
Ini bukan solusi yang baik. Anda dapat merusak dependensi paket lain dengan cara ini.
Ory Band

12
Ada perintah yang dapat Anda jalankan setelahnya untuk memberi tahu Anda jika Anda nuked dependensi lain yang diperlukan brew missingyang akan memberi tahu Anda perintah apa yang perlu Anda jalankan untuk mendapatkannya kembali
SeanJA

4

Simpan skrip berikut sebagai pembuatan bir

#!/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

Sekarang instal dengan perintah berikut

sudo install brew-purge /usr/local/bin

Sekarang jalankan

brew purge package

Contoh menggunakan 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.
$ 

2

Jawaban lain tidak berhasil untuk saya, tetapi ini berhasil (dalam fishshell):

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

Karena brew remove $pgagal ketika beberapa paket lain bergantung p.


2

Fungsi Shell Bourne Yang Lebih Lengkap

Sudah ada beberapa jawaban bagus, tetapi beberapa sudah ketinggalan zaman dan tidak ada yang sepenuhnya lengkap. Secara khusus, sebagian besar dari mereka akan menghapus dependensi tetapi tetap terserah Anda untuk menghapus formula yang ditargetkan sebelumnya setelahnya. Satu kalimat yang diposkan juga bisa membosankan jika Anda ingin menghapus lebih dari satu rumus sekaligus.

Berikut adalah fungsi shell yang kompatibel dengan Bourne (tanpa Bashisme yang diketahui) yang mengambil daftar formula, menghapus dependensi masing-masing, menghapus semua salinan formula itu sendiri, dan kemudian menginstal ulang dependensi yang hilang.

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
}

Itu diuji pada Homebrew 1.7.4.

Peringatan

Ini berfungsi pada semua formula standar yang saya uji. Saat ini tidak menangani tong, tetapi juga tidak akan mengeluh keras jika Anda mencoba untuk menghapus tong dengan nama yang sama dengan formula standar (misalnya MacVim).


1

Jawaban @jfmercer harus dimodifikasi sedikit agar berfungsi dengan minuman saat ini, karena output dari brew missingtelah berubah:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.