卸载 Homebrew 前,先把已装清单导出来
Homebrew 自带官方卸载脚本,行为与说明一致,真正要留意的是它的范围:Homebrew 本身和经它装上的一切会一起走,这两件事的分量因你来这里的目的而不同。
若是为了腾磁盘,这往往是开发者 Mac 上单次回收空间最大的一刀,若只是某一个命令行软件包出了问题,这就远超你需要的操作。
官方卸载脚本
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
运行前先读一遍,脚本很短,却是即将发生之事的权威说明,任何文章都代替不了,它支持 --dry-run,在你在意的机器上,这应是第一次调用的正确方式,只打印将删除的内容,不做任何改动。
脚本实际会删掉什么
卸载器会移除 Homebrew 安装前缀及其下的目录:bin、etc、include、lib、opt、sbin、share、var、Frameworks,以及 Cellar 与 Caskroom。
后两者才是关键,Cellar 存放每个命令行软件包的文件,Caskroom 存放图形应用包的元数据,卸掉 Homebrew 等于一并卸掉它们,经它安装的命令行工具会同时消失。
它还会清理 ~/Library/Caches/Homebrew 与 ~/Library/Logs/Homebrew、系统级 Homebrew 缓存、/etc/paths.d/homebrew,以及 /Applications 与 ~/Applications 里由 Homebrew 管理的应用程序。
动手前先记下已装了什么
清单卸完后无法找回,导出只需两条命令:
brew leaves > ~/Desktop/brew-formulae.txt
brew list --cask > ~/Desktop/brew-casks.txt
brew leaves 列出的是你主动安装的命令行软件包,不含背后拉进来的依赖,重建时要的就是这份列表,换到新机器上,这两个文件能把一天的回忆变成一行 brew install。
软件包存放在自身目录之外的内容会留下来,值得保留的有 Postgres 数据目录、/opt/homebrew/var 下的本地数据库和家目录里的配置,卸载器会删掉前缀下的 var,住在那里的数据库会一并消失,若它重要,先拷出来。
结尾那行容易被滑过去的提示
脚本结束时可能打印:部分可能属于 Homebrew 的文件未能删除,你可以自行处理,并附上路径列表。
这些路径只在这里被点名,常见原因是权限落在 Homebrew 未创建的目录上,列表通常很短,关掉终端前先复制保存,因为在已经卸干净的机器上再跑一次卸载器,不会再给出这份列表。
shell 配置文件里还记着它
卸载器不会改 .zprofile、.zshrc 或 .bash_profile,安装时加入的 eval "$(/opt/homebrew/bin/brew shellenv)" 仍会留下,之后每个新 shell 都会去跑一个已经不存在的程序,无害,但吵,删掉这行,或者打算重装就先留着。
先想清楚要不要做这么大的操作
多数卸载 Homebrew 的理由,用更窄的操作就够了,brew cleanup 回收旧版本与缓存下载,brew uninstall <formula> 只卸掉一个软件包,brew autoremove 清掉已无消费者的依赖,无论跑哪条,Mole 都会显示安装前缀在操作前后各占多少空间,这个数字能帮你判断是否真的需要整库卸掉。
用导出的清单重建
新机器上装好 Homebrew 之后,两条命令就能把之前那套装回来,分开两条是因为 cask 要带 --cask,混在一起会有一半装不上:
xargs brew install < brew-formulae.txt
xargs brew install --cask < brew-casks.txt
用 brew leaves 而不是 brew list,区别在这里才体现出来:brew list 会把依赖也列进去,照着装一遍会显式安装几百个本该由依赖关系自动带上的包,之后 brew autoremove 也不敢清它们了,因为它们变成了你主动要的,而 brew leaves 只给你当初真正 install 过的那些,依赖交给 Homebrew 自己解。