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


338

我有自制酒公式,希望与所有依赖关系一起卸载/删除,跳过其他软件包所依赖的软件包(也称为“ 软件包管理器”中的级联软件包删除)。

例如卸载软件包a取决于软件包bc,其中软件包d也取决于软件包c。结果应同时卸载ab跳过c

我怎样才能做到这一点?

必须有一种方法可以卸载软件包而不会留下不必要的垃圾


3
这不是值得这个名字的任何程序包管理器都应该开箱即用吗?大声笑
mljrg

Answers:


406

编辑:

看来现在可以使用名为brew rmdeps或的外部命令解决此问题brew rmtree

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

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

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


原始答案:

目前看来,没有简单的方法可以完成此操作。

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

调用了一个外部命令brew leaves,该命令将打印不依赖于其他软件包的所有软件包。

如果你的逻辑,并在输出brew leavesbrew deps <package>,你可能只是得到孤立依赖的软件包,您可以手动卸载后的名单。结合使用xargs,您会得到所需的东西(未经测试,请勿指望)。


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

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

有关更多信息,请参见上述问题评论


4
第二行给出错误:This command requires a keg argument
Shmidt

7
brew rmtree现在可以点按第三方脚本了:brew tap beeftornado/rmtree && brew install beeftornado/rmtree/brew-rmtree
Nick McCurdy 2014年

1
我已经尝试了@NicolasMcCurdy,可以确认这确实是当今最方便的方法。
Ory乐队

1
brew rm $(join <(brew leaves) <(brew deps FORMULA))做得好。您只需要一次又一次地运行它,直到删除所有依赖项。它不能一次卸载所有内容,因为依赖关系相互依赖。
格雷格·王

1
&& brew install brew-rmtree不再是必要的。
鲍里斯(Boris)

34

此处的目标是在破坏另一个程序包的依赖性的情况下删除给定的程序包及其依赖性。我使用以下命令:

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

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


必须添加--ignore-dependencies删除以使其工作。
alphadogg

2
这打破了我的brew配置,因为它没有重新安装其他软件包中使用的dep。不要使用
Marco Pappalardo

25

brew rmtree 根本不起作用。从该问题的链接中,我发现rmrec确实有效。上帝知道为什么brew没有这个作为本机命令。

brew tap ggpeti/rmrec
brew rmrec pkgname

确实喜欢这个,但是,如果您已经开始卸载自己并继续寻找需要删除的更多软件包,则仍然需要了解最广泛的软件包,或者可以简单地重新安装[FORMULA]并使用rmrec递归地删除其所有依赖项。
Dragon788

2
警告:似乎rmrec目前还不能很好地处理命名空间包。我使用的是插入的东西,linuxbrew/xorg/xorg它删除了除该软件包以外的所有内容,甚至明确命名了该软件包,它无法解析并且什么也没做。
Dragon788

确认建议使用的rmrec是不好的。它根本不处理依赖项。
omdv

你的意思是rmtreermrec确实处理依赖关系。
Timmmm

1
God knows why brew doesn't have this as a native command.=>因为Brew开发人员态度不好。他们甚至不允许人们打开任何问题。检查github.com/Homebrew/brew,现在只有少于20个问题。这么少。那是件好事儿吗?不,这很糟糕。
sgon00

15

基于@jfmercer的答案(纠正不仅仅需要注释)。

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

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

移除包装:

brew remove [FORMULA]

重新安装缺少的库:

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

meld在发现MeldMerge版本之后测试了卸载。


我在ffmpeg上安装了brew,这使事情严重混乱。使用上述方法清理ffmpeg,包括其扩展的依赖关系列表,对我来说很有效。
webtweakers

13

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

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
Devin G Rhode

1
上面的评论有误,编辑在5分钟后中断。试试brew cleanup -s && brew cask cleanup
Devin G Rhode '18

5

您可以为此使用UNIX管道

brew deps [FORMULA] | xargs brew rm

12
这不是一个好的解决方案。您可以通过这种方式破坏其他软件包的依赖性。
Ory乐队

12
之后您可以运行一个命令来告诉您是否对其他必需的依赖项brew missing进行了
核对

4

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

2

其他答案对我不起作用,但这确实有效(在fishshell中):

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

因为brew remove $p当其他软件包依赖时失败p


2

更完整的伯恩壳函数

已经有很多不错的答案,但是有些答案已经过时,而且没有一个是完整的。特别是,它们中的大多数将删除依赖项,但仍然由您自己决定,以便随后删除最初定位的公式。如果您想一次卸载多个公式,则发布的单行代码也可能很乏味。

这是一个与Bourne兼容的shell函数(没有任何已知的Bashism),该函数获取一个公式列表,删除每个公式的依存关系,删除公式本身的所有副本,然后重新安装所有缺少的依存关系。

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)同名的木桶,也不会大声抱怨。


1

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

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.