我有一个Homebrew公式,我希望卸载/删除及其所有依赖项,跳过其他包所依赖的包(在包管理器中称为级联包删除)。
例如,卸载依赖于包b和c的包a,其中包d也依赖于包c。结果应该卸载a和b,跳过c。
我该怎么做呢?
必须有一种方法来卸载一个包而不留下不必要的垃圾。
我有一个Homebrew公式,我希望卸载/删除及其所有依赖项,跳过其他包所依赖的包(在包管理器中称为级联包删除)。
例如,卸载依赖于包b和c的包a,其中包d也依赖于包c。结果应该卸载a和b,跳过c。
我该怎么做呢?
必须有一种方法来卸载一个包而不留下不必要的垃圾。
当前回答
基于@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 rmdeps或brew rmtree的外部命令解决了这个问题。
要安装和使用,发出以下命令:
$ brew tap beeftornado/rmtree
$ brew rmtree <package>
有关更多信息和讨论,请参阅上面的链接。
[编辑]见新的命令酿造自动删除在https://stackoverflow.com/a/66719581/160968
最初的回答:
目前,似乎没有简单的方法来实现这一点。
然而,我在Homebrew的GitHub页面上提交了一个问题,有人提出了一个临时解决方案,直到他们添加一个独占命令来解决这个问题。
有一个名为brew leaves的外部命令,它打印与其他包不依赖的所有包。
如果对brew leaves和brew deps <package>的输出执行逻辑和操作,可能只会得到孤立依赖包的列表,之后可以手动卸载这些依赖包。我想,将它与xargs结合起来,您将得到您所需要的(未经测试,不要指望它)。
编辑:有人刚刚提出了一个非常类似的解决方案,使用join代替xargs:
brew rm FORMULA
brew rm $(join <(brew leaves) <(brew deps FORMULA))
有关更多信息,请参阅上面提到的问题的评论。
酿造rmtree根本不能工作。从这个问题的链接中,我发现了rmrec,它实际上是有效的。天知道为什么brew没有这样的原生命令。
brew tap ggpeti/rmrec
brew rmrec pkgname
到2020年底,Homebrew团队添加了一个简单的命令酿造自动删除功能,以删除所有未使用的依赖项。
首先,卸载包:
酿造卸载<包>
然后,删除所有未使用的依赖项:
酿造autoremove
稍微精致;可提供多个包装;没有供应时有使用。
#!/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
将以下脚本保存为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.
$