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?
Untuk menghindari pemotongan daun yang mungkin merupakan hal yang Anda minta secara tidak sengaja, Anda harus menginstal port_cutleaves
paket 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 flat
format lama . Format sqlite
port DB adalah default untuk instalasi baru; instalasi lama yang ditingkatkan ke 1.9.x akan terus menggunakan flat
format 1 . Anda dapat mengonversi flat
sistem 1.9.x ke sqlite
format dengan memutakhirkan ke MacPorts 2.0 atau dengan mengubah portdbformat
nilai di /opt/local/etc/macports/macports.conf
lalu 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 leaves
pseudo-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 leaves
untuk menghapus instalasi port yang tidak dibutuhkan.
while sudo port uninstall leaves; do :; done
mengotomatisasi itu.sudo port uninstall --follow-dependents portname
salah, karena--follow-dependents
akan "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."Dari dokumen :
Perhatikan peringatan utama di paragraf terakhir. Ketergantungan persis seperti itu — dependensi — dan aplikasi yang berbeda dapat (akan) membutuhkan dependensi yang sama.
sumber
‑‑follow‑dependencies
vs‑‑follow‑dependents
.; bagian yang dikutip menggambarkan keduanya, tetapi hanya yang pertama yang berlaku untuk pertanyaanPerintah untuk menghapus port dan tanggungannya adalah:
Namun, jika port yang Anda uninstall memiliki tanggungan, port itu tidak akan dihapus tanpa
-f
flag (force).Tentu saja Anda harus mulai dengan membaca Panduan MacPorts secara khusus melihat ke bagian Uninstall guide.
sumber
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.
sumber
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.
sumber
Saya pikir jawaban yang lain, dan
--follow-dependents
bendera, tidak melakukan apa yang Anda inginkan. Jika Anda menginstalA
, danA
membutuhkanB
, maka berkat sistem manajemen paket yang luar biasa,B
akan diinstal untuk Anda. Anda dapat menghapusB
dan--follow-dependents
bendera akan menyadari dan menghapusA
. Tetapi bagaimana jika Anda menghapus instalasiA
, yang lebih mungkin, karenaA
apa yang Anda instal secara manual di tempat pertama? Dalam hal ini,B
tertinggal.Jika Anda menggunakan fink, paket debfoster dirancang untuk membersihkan sistem Anda dan menghapus dependensi yang tidak digunakan.
Meskipun
debfoster
tidak akan berfungsi untuk MacPorts, tampaknya ada portdebfoster
, misalnyaportsfoster
, meskipun tampaknya dihentikan ...Mungkin saat ini tidak ada solusi untuk MacPorts.
sumber
apt
sistem yang digunakan oleh Debian. Saya tidak menggunakan MacPorts, tetapi saya melakukanfink install debfoster
dan itu berfungsi dengan baik untuk saya.apt
sistem dan tidak menggunakandeb
file. Ide MacPorts terkait dengan port FreeBSD atau NetBSD pkgsrc, tetapi implementasinya sangat berbeda.fink
. Pencarian lebih lanjut menunjukkan bahwa itu tidak bekerja dengan MacPorts, tetapi ada klon, misalnya, lihatportsfoster