如何删除未使用的MacPorts软件包?


94

每当我通过MacPorts安装程序时,它都会获取并安装许多依赖项。当我卸载上述程序时,如何使MacPorts用它递归地删除所有未使用的依赖项?

Answers:


105

为了避免意外割掉可能是您要求的东西,您应该安装port_cutleaves软件包,然后运行sudo port_cutleaves https://guide.macports.org/#using.common-tasks.keeplean


MacPorts 1.9.0添加了,sqlite portdbformatMacPorts 2.0.0删除了旧flat格式。该sqlite端口DB格式是新安装的默认; 升级到1.9.x的旧安装将继续使用flat格式1。您可以通过升级到MacPorts 2.0或更改其中的值 ,然后以root身份发出port命令(例如)来将1.9.x flat系统转换为sqlite格式。portdbformat/opt/local/etc/macports/macports.confsudo port installed

新格式的功能之一是,它可以跟踪“请求的”端口安装和“非请求的”端口安装。未请求的端口是仅由于其他端口依赖于此端口而安装的端口。该leaves伪PORTNAME扩展到所有在没有其他安装port依赖未请求的端口。您可以使用它来“清理”不需要的端口,即使您最初并没有使用它们来进行卸载sudo port uninstall --follow-dependencies portname(也可以执行您想要的操作,但前提是您每次每次卸载时都记得使用它)。


卸载任何现有叶子之前,应检查它们。

port echo leaves

一些常见的叶(automakegperflibtoolpkgconfig)是构建时常用的端口的依赖关系,所以你可能要“请求”他们(sudo port setrequested port1 port2 port3 …),以避免卸载它们只是为了有后重新安装它们。

您可以很容易地卸载所有剩余的叶子:

sudo port uninstall leaves

注意:修剪叶子之前,您可能还想卸载不再“活动”的旧版本端口。这可能会显示更多的叶子(例如,端口是已安装端口的依赖项,但处于非活动状态):

sudo port uninstall inactive

MacPorts指南》中有几节,还介绍了用于卸载不需要的端口的过程。leaves


11
谢谢。这很有帮助。似乎您可能必须运行回显叶子并多次背靠背卸载,以确保所有叶子均已清理。在回显叶子返回空结果之前,我至少运行了两次命令
Antony 2012年

6
您可以说些类似while sudo port uninstall leaves; do :; done的自动化操作。
汤姆·安德森

2
@ChrisJohnsen sudo port uninstall --follow-dependents portname不正确,因为--follow-dependents它将“递归卸载依赖于指定端口的所有端口”。正确的选项是--follow-dependencies,它将“以递归方式卸载指定端口所依赖的所有端口。这不会卸载标记为已请求或具有其他依赖关系的依赖关系。”
TachyonVortex 2013年

8

从文档

卸载操作将卸载已安装的端口。

%% sudo port uninstall vile Note

要还递归卸载给定端口所依赖的端口,请使用该‑‑follow‑dependencies标志。这不会卸载标记为已请求或具有其他依赖项的依赖项。

要在卸载端口本身之前递归卸载依赖于给定端口的所有端口,请使用 ‑‑follow‑dependents flag

如果端口是另一个已安装端口的依赖项,则除非先删除依赖端口,否则卸载将不会删除它。要覆盖此行为,请使用-f(强制)开关。这显然会破坏家属。除非您知道自己在做什么,否则不要强行卸载端口。

%% sudo port -f uninstall vile

请注意最后一段中的主要警告。依赖关系就是这种依赖关系,不同的应用程序可能(将)需要相同的依赖关系。


我认为这不能回答问题。OP希望删除程序及其所需的东西,而不是删除程序及其所需的东西。

2
@mankoff:‑‑follow‑dependencies‑‑follow‑dependents;引用的段落描述了两者,但只有第一个适用于该问题
Chris Johnsen

3
就个人而言,我认为Philip解释这两个参数非常好,因此我们充分意识到这些参数及其对发出此类命令的影响
Antony 2012年


3

MacPorts的contrib目录中还有一个名为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的解决方案。


但是,基于Debian的系统上的deb文件不是debfoster吗?如何在Mac OS X的MacPorts端口上使用它?
hpy

它已被移植到OS X和MacPorts,而fink基于aptDebian使用的系统。我不使用MacPorts,但我做了一个fink install debfoster,对我来说效果很好。

MacPorts与apt系统无关,并且不使用deb文件。MacPorts的概念与FreeBSD端口或NetBSD pkgsrc有关,但实现方式却大不相同。
克里斯·约翰森

1
好。感谢您的更正。不管怎样,debfoster已被移植通过fink。进一步的搜索显示它不适用于MacPorts,但是存在克隆,例如,请参见portsfoster
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.