我有一个Homebrew公式,我希望卸载/删除及其所有依赖项,跳过其他包所依赖的包(在包管理器中称为级联包删除)。

例如,卸载依赖于包b和c的包a,其中包d也依赖于包c。结果应该卸载a和b,跳过c。

我该怎么做呢?

必须有一种方法来卸载一个包而不留下不必要的垃圾。


当前回答

这里的目标是删除给定的包及其依赖关系,而不破坏另一个包的依赖关系。我使用这个命令:

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

注:经过编辑以反映@alphadogg的有用评论。

其他回答

基于@jfmercer的回答(更正需要的不仅仅是评论)。

删除包的依赖项(不删除包):

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

删除包:

brew remove [FORMULA]

重新安装丢失的库:

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

在发现MeldMerge发布后测试卸载meld。

这里的目标是删除给定的包及其依赖关系,而不破坏另一个包的依赖关系。我使用这个命令:

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

注:经过编辑以反映@alphadogg的有用评论。

将以下脚本保存为brew-purge

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

现在使用以下命令安装它

sudo install brew-purge /usr/local/bin

现在运行它

brew purge package

使用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.
$ 

到2020年底,Homebrew团队添加了一个简单的命令酿造自动删除功能,以删除所有未使用的依赖项。

首先,卸载包:

酿造卸载<包>

然后,删除所有未使用的依赖项:

酿造autoremove

酿造rmtree根本不能工作。从这个问题的链接中,我发现了rmrec,它实际上是有效的。天知道为什么brew没有这样的原生命令。

brew tap ggpeti/rmrec
brew rmrec pkgname