Bagaimana cara menghapus paket MacPorts yang tidak digunakan?

94

Setiap kali saya menginstal program melalui MacPorts, ia mendapat dan menginstal banyak dependensi. Ketika saya mencopot program tersebut, bagaimana cara membuat MacPorts menghapus semua dependensi yang tidak digunakan dengannya secara rekursif?

hpy
sumber

Jawaban:

105

Untuk menghindari pemotongan daun yang mungkin merupakan hal yang Anda minta secara tidak sengaja, Anda harus menginstal port_cutleavespaket kemudian jalankan sudo port_cutleaves https://guide.macports.org/#using.common-tasks.keeplean


MacPorts 1.9.0 menambahkansqlite portdbformat dan MacPorts 2.0.0 menjatuhkan flatformat lama . Format sqliteport DB adalah default untuk instalasi baru; instalasi lama yang ditingkatkan ke 1.9.x akan terus menggunakan flatformat 1 . Anda dapat mengonversi flatsistem 1.9.x ke sqliteformat dengan memutakhirkan ke MacPorts 2.0 atau dengan mengubah portdbformatnilai di /opt/local/etc/macports/macports.conflalu mengeluarkan perintah port sebagai root (misalnya sudo port installed).

Salah satu fitur format baru adalah bahwa ia melacak instalasi port "diminta" versus "tidak diminta". Port yang tidak diminta adalah port yang hanya diinstal karena beberapa port lain bergantung padanya. The leavespseudo-portname memperluas ke semua port unrequested di mana tidak ada port yang terpasang lainnya tergantung. Anda dapat menggunakan ini untuk "membersihkan" port yang tidak dibutuhkan bahkan jika Anda awalnya tidak mencopotnya sudo port uninstall --follow-dependencies portname(yang akan melakukan apa yang Anda inginkan, tetapi hanya jika Anda ingat untuk menggunakannya setiap kali Anda mencopot sesuatu).


Anda harus memeriksa dedaunan yang ada sebelum mencopotnya.

port echo leaves

Beberapa daun umum ( automake, gperf, libtool, pkgconfig) adalah membangun-waktu dependensi dari port umum, sehingga Anda mungkin ingin “permintaan” mereka ( sudo port setrequested port1 port2 port3 …) untuk menghindari menguninstall mereka hanya harus menginstal ulang nanti.

Anda dapat mencopot semua daun yang tersisa dengan mudah:

sudo port uninstall leaves

Catatan: Sebelum memangkas dedaunan Anda, Anda mungkin juga ingin menghapus instalasi versi port lama yang tidak lagi “aktif”. Ini dapat mengungkapkan beberapa daun lagi (yaitu port yang dependensi port yang diinstal, tetapi tidak aktif):

sudo port uninstall inactive

Ada beberapa bagian dalam Panduan MacPorts yang juga menjelaskan proses penggunaan leavesuntuk menghapus instalasi port yang tidak dibutuhkan.

Chris Johnsen
sumber
11
Terima kasih. Ini cukup membantu. Tampaknya Anda harus menjalankan gema daun dan menghapus dedaunan kembali ke belakang beberapa kali untuk memastikan bahwa semua daun dibersihkan. Saya menjalankan kedua perintah setidaknya 4 kali sebelum gema meninggalkan hasil kosong
Antony
6
Anda bisa mengatakan sesuatu seperti while sudo port uninstall leaves; do :; donemengotomatisasi itu.
Tom Anderson
2
@ChrisJohnsen sudo port uninstall --follow-dependents portnamesalah, karena --follow-dependentsakan "menghapus secara rekursif semua port yang bergantung pada port yang ditentukan". Opsi yang benar di sini adalah --follow-dependencies, yang akan "menghapus secara rekursif semua port yang bergantung pada port yang ditentukan. Ini tidak akan menghapus dependensi yang ditandai sebagai diminta atau yang memiliki tanggungan lain."
TachyonVortex
8

Dari dokumen :

Tindakan uninstall akan menghapus instalasi port yang diinstal.

%% sudo port uninstall vile Note

Untuk juga menghapus instalasi port yang bergantung pada port yang diberikan secara rekursif, gunakan ‑‑follow‑dependenciesbendera. Ini tidak akan menghapus ketergantungan yang ditandai sebagai diminta atau yang memiliki tanggungan lain.

Untuk menghapus secara instal semua port yang bergantung pada port yang diberikan sebelum mencopot port itu sendiri, gunakan ‑‑follow‑dependents flag.

Jika suatu port merupakan dependensi dari port lain yang diinstal, uninstall tidak akan menghapusnya kecuali Anda menghapus port dependen terlebih dahulu. Untuk mengesampingkan perilaku ini, gunakan sakelar -f (paksa). Ini jelas akan mematahkan tanggungan. Jangan paksa mencopot porta kecuali Anda tahu apa yang Anda lakukan.

%% sudo port -f uninstall vile

Perhatikan peringatan utama di paragraf terakhir. Ketergantungan persis seperti itu — dependensi — dan aplikasi yang berbeda dapat (akan) membutuhkan dependensi yang sama.

Philip Regan
sumber
Saya tidak berpikir ini menjawab pertanyaan. OP ingin menghapus suatu program dan hal-hal yang diperlukannya, bukan menghapus program dan hal-hal yang memerlukannya.
2
@mankoff: ‑‑follow‑dependenciesvs ‑‑follow‑dependents.; bagian yang dikutip menggambarkan keduanya, tetapi hanya yang pertama yang berlaku untuk pertanyaan
Chris Johnsen
3
Secara pribadi, saya pikir mereka hebat karena Philip menjelaskan kedua parameter, jadi kami sepenuhnya menyadari parameter dan implikasinya terhadap mengeluarkan perintah seperti itu
Antony
3

Perintah untuk menghapus port dan tanggungannya adalah:

sudo port uninstall foo --follow-dependents

Namun, jika port yang Anda uninstall memiliki tanggungan, port itu tidak akan dihapus tanpa -fflag (force).

Tentu saja Anda harus mulai dengan membaca Panduan MacPorts secara khusus melihat ke bagian Uninstall guide.

Andrei Freeman
sumber
3

Ada juga skrip di direktori contrib MacPorts yang disebut port_cutleaves yang dapat Anda jalankan untuk menghapus dependensi yang tidak dibutuhkan: http://trac.macports.org/browser/contrib/ . Ini akan meminta Anda untuk setiap port yang harus dihapus dan memungkinkan menyimpannya, jika Anda mau.

Clemens Lang
sumber
2

Saya telah menulis beberapa skrip untuk mengotomatiskan pembersihan port: https://github.com/vasi/macports-tools

Skrip 'macportsfoster' akan menampilkan daftar semua port yang tidak diperlukan oleh apa pun dalam daftar yang diminta, dipesan sedemikian rupa sehingga 'port menonaktifkan $ (macportsfoster)' akan menghapus semuanya dalam satu kesempatan.

Vasi
sumber
1

Saya pikir jawaban yang lain, dan --follow-dependentsbendera, tidak melakukan apa yang Anda inginkan. Jika Anda menginstal A, dan Amembutuhkan B, maka berkat sistem manajemen paket yang luar biasa, Bakan diinstal untuk Anda. Anda dapat menghapus Bdan --follow-dependentsbendera akan menyadari dan menghapus A. Tetapi bagaimana jika Anda menghapus instalasi A, yang lebih mungkin, karena Aapa yang Anda instal secara manual di tempat pertama? Dalam hal ini, Btertinggal.

Jika Anda menggunakan fink, paket debfoster dirancang untuk membersihkan sistem Anda dan menghapus dependensi yang tidak digunakan.

Debfoster akan membantu Anda menyingkirkan paket (pustaka misalnya) tertinggal di sistem Anda ketika program yang membutuhkannya dihapus atau ditingkatkan ke versi yang tidak memiliki ketergantungan.

Meskipun debfostertidak akan berfungsi untuk MacPorts, tampaknya ada port debfoster, misalnya portsfoster, meskipun tampaknya dihentikan ...

Mungkin saat ini tidak ada solusi untuk MacPorts.


sumber
Tetapi bukankah debfoster untuk file deb pada sistem berbasis Debian? Bagaimana cara menggunakannya untuk port MacPorts di Mac OS X?
hpy
Telah porting ke OS X dan MacPorts dan fink didasarkan pada aptsistem yang digunakan oleh Debian. Saya tidak menggunakan MacPorts, tetapi saya melakukan fink install debfosterdan itu berfungsi dengan baik untuk saya.
MacPorts tidak terkait dengan aptsistem dan tidak menggunakan debfile. Ide MacPorts terkait dengan port FreeBSD atau NetBSD pkgsrc, tetapi implementasinya sangat berbeda.
Chris Johnsen
1
BAIK. Terima kasih atas koreksinya. Apapun, debfoster telah diport untuk berfungsi dengan baik fink. Pencarian lebih lanjut menunjukkan bahwa itu tidak bekerja dengan MacPorts, tetapi ada klon, misalnya, lihatportsfoster