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

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

我该怎么做呢?

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


当前回答

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

brew tap ggpeti/rmrec
brew rmrec pkgname

其他回答

编辑:

现在,使用名为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))

有关更多信息,请参阅上面提到的问题的评论。

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

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

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

brew tap ggpeti/rmrec
brew rmrec pkgname

为此,您可以使用UNIX管道

brew deps [FORMULA] | xargs brew rm

@jfmercer的答案必须稍微修改一下才能使用当前的brew,因为缺少brew的输出已经改变:

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