卸载/删除一个自制程序包,包括它的所有依赖项

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

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

我该怎么做呢?

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

477008 次浏览

编辑:

它看起来像这个问题现在可以使用一个名为__ABC0或brew rmtree的外部命令来解决

要安装和使用,发出以下命令:

$ brew tap beeftornado/rmtree
$ brew rmtree <package>

有关更多信息和讨论,请参阅上面的链接。


[编辑]参见https://stackoverflow.com/a/66719581/160968中的新命令brew autoremove


最初的回答:

目前,似乎没有简单的方法来实现这一点。

然而,我在Homebrew的GitHub页面上提交了一个问题,有人提出了一个临时解决方案,直到他们添加一个独占命令来解决这个问题。

有一个名为brew leaves外部命令,它打印所有不依赖于其他包的包。

如果你对brew leavesbrew deps <package>的输出执行逻辑<强>和< / >强,你可能只会得到一个孤立的依赖包列表,之后你可以手动卸载这些依赖包。将它与xargs结合起来,你会得到你需要的,我猜(未经测试,不要指望这个)。


有人刚刚提出了一个非常类似的解决方案,使用join而不是xargs:

brew rm FORMULA
brew rm $(join <(brew leaves) <(brew deps FORMULA))

更多信息请参见对上面提到的问题发表评论

为此,您可以使用UNIX管道

brew deps [FORMULA] | xargs brew rm

使用这个答案需要创建并维护一个文件,其中包含希望安装在系统上的包名。如果您还没有安装包,请使用以下命令并删除您不想保留安装的包名。

brew leaves > brew_packages

然后,您可以通过运行以下命令删除所有已安装但不需要的包和任何不必要的依赖项

brew_clean brew_packages

brew_clean在这里可用:https://gist.github.com/cskeeters/10ff1295bca93808213d

该脚本获取你在brew_packages中指定的所有包及其所有依赖项,并将它们与brew list的输出进行比较,最后在与用户验证该列表后删除不需要的包。

在这一点上,如果你想删除包a,你只需从brew_packages文件中删除它,然后重新运行brew_clean brew_packages。它会移除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 rmtree 根本不管用。从这个问题上的链接,我发现rmrec实际上是有效的。天知道为什么brew没有这个本地命令。

brew tap ggpeti/rmrec
brew rmrec pkgname

其他答案对我不适用,但这个做到了(在fish shell中):

brew remove <package>
for p in (brew deps <package>)
brew remove $p
end

因为当其他包依赖于p时,brew remove $p会失败。

@jfmercer的答案必须稍微修改一下才能与当前的brew一起工作,因为brew missing的输出已经改变:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install

一个更完整的伯恩壳函数

已经有很多好的答案,但有些已经过时了,没有一个是完全完整的。特别是,它们中的大多数会删除依赖项,但仍然让您自行删除最初的目标公式。如果您想一次卸载多个公式,那么所发布的一行程序也可能很乏味。

下面是一个与boure兼容的shell函数(没有任何已知的Bashisms),它接受一个公式列表,删除每个公式的依赖项,删除公式本身的所有副本,然后重新安装任何缺失的依赖项。

unbrew () {
local formula
for formula in "$@"; do
brew deps "$formula" |
xargs brew uninstall --ignore-dependencies --force
brew uninstall --force "$formula"
done
brew missing | cut -f2 -d: | sort -u | xargs brew install
}

它在Homebrew 1.7.4上进行了测试。

警告

这适用于我测试过的所有标准公式。它目前还不能处理酒桶,但如果你试图解煮一个与标准公式同名的酒桶(例如MacVim),它也不会大声抱怨。

将下面的脚本保存为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.
$

稍微精致;可提供多个包装;没有供应时有使用。

#!/bin/bash
# Removes the package and all dependancies.


if [ $# -eq 0 ]; then
echo "$(basename $0) <pkg> [<pkg> [...]]"
exit 1
fi


function tree() {
pkg="$1"
join <(brew leaves) <(sort <(brew deps ${pkg}; echo ${pkg}))
}


let e=0
for pkg in "$@"; do
printf "Purging %s and its dependencies...\n" "${pkg}"
deps=( $(tree ${pkg}) )
while (( ${#deps[@]} > 0 )); do
brew rm "${deps[@]}"
deps=( $(tree ${pkg}) )
done
done

到2020年底,Homebrew团队添加了一个简单的命令brew autoremove来删除所有未使用的依赖项。

首先,卸载包:

brew uninstall <package>

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

brew autoremove