卸载/删除 Homebrew 包,包括其所有依赖项

Posted

技术标签:

【中文标题】卸载/删除 Homebrew 包,包括其所有依赖项【英文标题】:Uninstall / remove a Homebrew package including all its dependencies 【发布时间】:2011-11-11 12:03:59 【问题描述】:

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

例如卸载依赖包bc的包a,其中包d也依赖包c。结果应该同时卸载 ab,跳过 c

我该怎么做?

必须有一种方法可以在不留下不必要的垃圾的情况下卸载软件包。

【问题讨论】:

这不是任何值得这个名字的包管理器开箱即用的吗?!哈哈 截至 2021 年,brew autoremove 是您正在寻找的内容: 【参考方案1】:

编辑:

看起来像the issue is now solved using an external command called brew rmdeps or brew rmtree

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

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

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


[编辑] 在https://***.com/a/66719581/160968 中查看新命令brew autoremove


原答案:

目前看来,没有简单的方法可以做到这一点。

但是,我filed an issue on Homebrew's GitHub page,有人建议了一个临时解决方案,直到他们添加一个专有命令来解决这个问题。

有一个名为brew leaves 的external command 打印所有不依赖于其他包的包。

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


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

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

请参阅comment on the issue mentioned above 了解更多信息。

【讨论】:

在 2020 年,这个解决方案似乎是这里提出的所有世界中最好的。值得一提的是,大部分时候在清除了很多包之后,需要以下brew cleanup -s &amp;&amp; \rm -rf "$(brew --cache)"【参考方案2】:

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

首先,卸载包:

brew uninstall &lt;package&gt;

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

brew autoremove

【讨论】:

这也删除了brewfile中列出的一些包,这是为什么呢? @stevemao 尝试询问 Homebrew 团队。【参考方案3】:

brew rmtreedoesn't work at all。从关于该问题的链接中,我发现 rmrec 确实有效。天知道为什么brew 没有这个本地命令。

brew tap ggpeti/rmrec
brew rmrec pkgname

【讨论】:

真的很喜欢这个,虽然如果你已经开始卸载自己并不断寻找更多需要删除的包,你仍然需要知道最广泛的接触包是什么,或者你可以只需简单地重新安装[FORMULA],然后使用 rmrec 以递归方式正确删除它的所有依赖项。 警告:rmrec 目前似乎还不能很好地处理命名空间包。我正在使用引入linuxbrew/xorg/xorg 的东西,它删除了除该包之外的所有内容,甚至明确命名该包它无法解决它并且什么也没做。 确认使用rmrec 的建议不好。它根本不处理依赖关系。 你的意思是rmtreermrec 确实处理依赖关系。 God knows why brew doesn't have this as a native command. => 因为 brew 开发人员态度不好。他们甚至不允许人们打开任何问题。检查github.com/Homebrew/brew,它现在只有不到20个问题。这么小的数字。那是件好事儿吗?不,这很糟糕。【参考方案4】:

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

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

注意:已编辑以反映 @alphadogg 的有用评论。

【讨论】:

必须添加 --ignore-dependencies 才能删除才能使其正常工作。 这破坏了我的 brew 配置,因为它没有重新安装其他包中使用的 deps。不要使用【参考方案5】:

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

移除包的依赖(不移除包):

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

删除包:

brew remove [FORMULA]

重新安装缺少的库:

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

在发现MeldMerge releases后测试卸载meld

【讨论】:

我用 brew 安装了 ffmpeg,这把事情搞砸了。使用上述方法清理 ffmpeg,包括其扩展的依赖项列表,对我有用。 对我来说brew deps 显示的包与brew uninstall 尝试后显示的包不同。【参考方案6】:

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

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 clean 现在是内置的,试试brew clean -s 以上评论有误,编辑在 5 分钟后中断。试试brew cleanup -s &amp;&amp; brew cask cleanup【参考方案7】:

将以下脚本另存为 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.
$ 

【讨论】:

【参考方案8】:

您可以为此使用 UNIX 管道

brew deps [FORMULA] | xargs brew rm

【讨论】:

这不是一个好的解决方案。你可以通过这种方式打破其他包的依赖关系。 您可以在之后运行一个命令来告诉您是否对任何其他必需的依赖项brew missing 进行了核对,这将告诉您需要运行什么命令才能恢复它们【参考方案9】:

更完整的 Bourne Shell 函数

已经有许多好的答案,但有些已经过时,而且没有一个是完全完整的。特别是,它们中的大多数将删除依赖项,但之后仍由您自行删除最初的目标公式。如果您想一次卸载多个公式,使用发布的单行代码也可能很乏味。

这是一个与 Bourne 兼容的 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 配置和 zsh【参考方案10】:

其他答案对我不起作用,但确实如此(在fish shell 中):

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

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

【讨论】:

【参考方案11】:

@jfmercer 的答案必须稍作修改才能使用当前的 brew,因为 brew missing 的输出已更改:

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

【讨论】:

【参考方案12】:

略显精致;可供应多种包装;没有提供时有用法。

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

【讨论】:

以上是关于卸载/删除 Homebrew 包,包括其所有依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Homebrew npm install:无法符号链接

卸载 cpan 安装的所有 perl 模块

iOS - Homebrew macOS 包管理

npm命令用于卸载或修剪Node.js中未使用的包

卸载包时如何在 pipenv 中自动删除依赖的 Python 包?

Luogu P2146 软件包管理器(树链剖分+线段树)