Как удалить неиспользуемые пакеты MacPorts?

93

Всякий раз, когда я устанавливаю программу через MacPorts, она получает и устанавливает множество зависимостей. Когда я удаляю указанную программу, как заставить MacPorts рекурсивно удалять все неиспользуемые зависимости с ней?

HPY
источник

Ответы:

105

Чтобы случайно не срезать листья, которые могут быть запрошены, вам следует установить port_cutleavesпакет и запустить sudo port_cutleaves https://guide.macports.org/#using.common-tasks.keeplean.


MacPorts 1.9.0 добавил,sqlite portdbformat а MacPorts 2.0.0 отбросил старый flatформат . Формат sqliteDB DB используется по умолчанию для новых установок; старые установки, которые были обновлены до 1.9.x, будут продолжать использовать flatформат 1 . Вы можете преобразовать систему 1.9.x flatв sqliteформат, обновив MacPorts 2.0 или изменив portdbformatзначение в, /opt/local/etc/macports/macports.confа затем введя команду порта от имени root (например sudo port installed).

Одной из особенностей нового формата является то, что он отслеживает «запрошенные» и «незапрошенные» установки портов. Нераспрашиваемый порт - это тот, который был установлен только потому, что от него зависит какой-то другой порт. Имя leavesпсевдопорта распространяется на все незапрошенные порты, от которых не зависит ни один другой установленный порт. Вы можете использовать это, чтобы «очистить» ненужные порты, даже если вы изначально не удаляли их sudo port uninstall --follow-dependencies portname(что будет делать то, что вы хотите, но только если вы не забываете использовать его каждый раз при удалении чего-либо).


Вы должны проверить существующие листья перед удалением любого из них.

port echo leaves

Некоторые общие листья ( automake, gperf, libtool, pkgconfig) строятся времени зависимости общих портов, так что вы можете «запрос» их ( sudo port setrequested port1 port2 port3 …) , чтобы избежать удаления их просто заново установить их позже.

Вы можете удалить любые оставшиеся листья довольно легко:

sudo port uninstall leaves

Примечание. Перед удалением листьев вы также можете удалить старые версии портов, которые больше не являются «активными». Это может выявить еще несколько листьев (т. Е. Порты, которые являются зависимостями от портов, которые установлены, но не активны):

sudo port uninstall inactive

В MacPorts Guide есть несколько разделов, в которых также описан процесс использования для удаления ненужных портов.leaves

Крис Джонсен
источник
11
Благодарю. Это довольно полезно. Кажется, что вам, возможно, придется запускать эхо-листы и удалять листы подряд несколько раз, чтобы убедиться, что все листья очищены. Я выполнил обе команды по крайней мере 4 раза, прежде чем листья эха вернут пустой результат
Антоний
6
Вы могли бы сказать что-то вроде while sudo port uninstall leaves; do :; doneавтоматизации этого.
Том Андерсон
2
@ChrisJohnsen sudo port uninstall --follow-dependents portnameневерен, потому --follow-dependentsчто "рекурсивно удалит все порты, которые зависят от указанного порта". Правильный вариант здесь --follow-dependencies, который «рекурсивно удалит все порты, от которых зависит указанный порт. Это не удалит зависимости, помеченные как запрошенные или имеющие другие зависимости».
TachyonVortex
8

Из документов :

Действие удаления приведет к удалению установленного порта.

%% sudo port uninstall vile Note

Чтобы также рекурсивно удалить порты, от которых зависит данный порт, используйте ‑‑follow‑dependenciesфлаг. Это не приведет к удалению зависимостей, помеченных как запрошенные или имеющих других зависимостей.

Чтобы рекурсивно удалить все порты, которые зависят от данного порта, перед удалением самого порта, используйте ‑‑follow‑dependents flag.

Если порт является зависимостью от другого установленного порта, удаление не удалит его, если вы сначала не удалите зависимый порт (ы). Чтобы переопределить это поведение, используйте ключ -f (force). Это, очевидно, сломает иждивенцев. Не пытайтесь принудительно удалить порты, если вы не знаете, что делаете.

%% sudo port -f uninstall vile

Обратите внимание на главную оговорку в последнем абзаце. Зависимости - это как раз и есть зависимости - и разные приложения могут (будут) требовать одинаковых зависимостей.

Филип Реган
источник
Я не думаю, что это отвечает на вопрос. ОП хочет удалить программу и все, что ей требуется, а не удалить программу и то, что ей требуется.
2
@mankoff: ‑‑follow‑dependenciesпротив ‑‑follow‑dependents; процитированный отрывок описывает оба, но только первый относится к вопросу
Крис Джонсен
3
Лично я думаю, что замечательно, что Филипп объясняет оба параметра, поэтому мы полностью осведомлены о параметрах и их последствиях при выдаче такой команды
Антоний
3

Команда для удаления порта и его зависимых элементов:

sudo port uninstall foo --follow-dependents

Однако, если порт, который вы удаляете, имеет иждивенцев, он не будет удален без -fфлага (force).

Конечно, вы должны начать с прочтения Руководства по MacPorts, в частности, изучив раздел руководства по удалению.

Андрей Фриман
источник
3

В каталоге ресурсов MacPorts также есть скрипт port_cutleaves, который вы можете запустить для удаления ненужных зависимостей: http://trac.macports.org/browser/contrib/ . Он попросит вас указать каждый порт, который будет удален, и позволит сохранить некоторые из них, если вы захотите.

Клеменс Ланг
источник
2

Я написал несколько сценариев для автоматизации очистки портов: https://github.com/vasi/macports-tools

Сценарий 'macportsfoster' выведет список всех портов, которые не требуются для чего-либо в запрашиваемом списке, упорядоченный таким образом, что 'port deactivate $ (macportsfoster)' удалит все из них за один раз.

Васи
источник
1

Я думаю, что другие ответы и --follow-dependentsфлаг, не делать то, что вы хотите. Если вы устанавливаете Aи Aтребуете B, то благодаря замечательным системам управления пакетами, Bбудут установлены для вас. Вы можете удалить, Bи --follow-dependentsфлаг будет знать и удалить A. Но что, если вы удалите A, что более вероятно, потому что Aэто то, что вы установили вручную в первую очередь? В этом случае Bостается позади.

Если вы используете fink, пакет debfoster предназначен для очистки вашей системы и удаления неиспользуемых зависимостей.

Debfoster поможет вам избавиться от пакетов (например, библиотек), которые остались в вашей системе, когда программа, которая требовала ее, была удалена или обновлена ​​до версии, которая не имеет зависимости.

Хотя debfosterне будет работать для MacPorts, есть порты debfoster, например portsfoster, хотя, кажется, больше не поддерживается ...

Возможно, в настоящее время не существует решения для MacPorts.


источник
Но разве не debfoster для файлов deb в системе на основе Debian? Как мне использовать его для портов MacPorts в Mac OS X?
hpy
Он был портирован на OS X, а MacPorts и fink основаны на aptсистеме, которая используется Debian. Я не использую MacPorts, но я это сделал, fink install debfosterи у меня все получилось .
MacPorts не имеет отношения к aptсистеме и не использует debфайлы. Идея MacPorts связана с портами FreeBSD или NetBSD pkgsrc, но реализация сильно отличается.
Крис Джонсен
1
ХОРОШО. Спасибо за исправление. Независимо от того, debfoster был перенесен, чтобы работать хорошо через fink. Дальнейший поиск показывает, что он не работает с MacPorts, но есть клоны, например, смотритеportsfoster