Brew 不支持某些版本的 macOS,如何使用它安装软件包

我最近重新启用了我的 Macbook Air 2015,它最后官方支持的 macOS 版本是 Monterey 12.7.6。而我最近需要在上面安装 Docker、Qemu 和 Colima,在安装 Qemu 时碰到了一些困难。

安装这些命令行工具的常规做法是使用 Brew,但在今年9月份的一次更新中,Brew 放弃了对 Monterey 的支持,如果强行安装使用它,软件包不会直接安装 bottle 二进制而是从源代码开始安装,同时会报出下面几行字:

Warning: You are using macOS 12.
We (and Apple) do not provide support for this old version.
It is expected behaviour that some formulae will fail to build in this old version.
It is expected behaviour that Homebrew will be buggy and slow.
Do not create any issues about this on Homebrew’s GitHub repositories.
Do not create any issues even if you think this message is unrelated.
Any opened issues will be immediately closed without response.
Do not ask for help from Homebrew or its maintainers on social media.
You may ask for help in Homebrew’s discussions but are unlikely to receive a response.
Try to figure out the problem yourself and submit a fix as a pull request.
We will review it but may or may not accept it.

非常不幸的是,通过 Brew 走源代码安装的 Qemu 截稿最新的 9.1.1 在 Monterey 上可以通过编译,但通不过单元检测,于是一直无法顺利安装。期间我尝试使用 macPorts,但它安装 Qemu 通过 Colima 启动时有一个参数不对,导致串行日志没有内核启动内容,这意味着启动失败了;也想尝试另一个 Fink,但它居然连 Catalina 的支持都未完成。所以我开始了对 Brew 的研究,这里记录一下结果。

资料来源于 Github 上 “macOS 12 unsupported? #5603” 的这条回复 - https://github.com/orgs/Homebrew/discussions/5603#discussioncomment-11253847

核心点有:

  1. Brew 虽然停止了对 Monterey 的支持,但是针对老系统的 bottle 并未删除,只是不再在老系统上构建新版本的软件包。
  2. 这里依然使用 Bottle 安装,原因是我们只需要使用到软件包,而不想安装编译所需的依赖。
  3. Bottle 都是老版本的,我们无法在老系统上使用新版本软件包的 Bottle。

操作方法

这里以 Qemu 为例。

找到对应软件包的 Formula 和对应提交哈希

Qemu - https://github.com/Homebrew/homebrew-core/blob/master/Formula/q/qemu.rb

点击右上角 History,翻找它的提交历史,找到 Monterey 的 bottle 依然被保留时的提交哈希。

Qemu - https://github.com/Homebrew/homebrew-core/commit/a30892887bd5ee16db1ecf3094951734e5e4dfe4

这时可见它的提交哈希是 a308928

进入 Homebrew 切换到该提交哈希

cd $(brew --repository)/Library/Taps/homebrew/homebrew-core/
git checkout -b qemu-freeze a308928

这里没有使用原文的 macOS-monterey-freeze 分支名称,是因为原文后面一段使用了相同的分支名,会出冲突。同时因为不同的软件包的哈希值可能是不一样的,其实根据需要安装的软件包起分支名称会更加合适一点。

不过 Qemu 对应的 a308928 提交于2024年9月10日,刚好在 Brew 放弃对 Monterey 支持之前,我自己测试它已经足够应对在 Monterey 上安装老版本软件包的需要了 – 比如切到 Colima 的提交哈希时,它还会从源代码构建部分依赖,但用 Qemu 那个分支就不会。我自己打算锁定这个提交的时间了。

然后使用 brew install 安装需要的软件包,就会发现它不会再安装最新版本,而是安装老版本的 Bottle 了。

brew install qemu # It will install 9.1.0 from bottle, not the 9.1.1 from source

锁定 Brew 让它不再自动更新 Formula

在设置环境变量的启动脚本中,增加一个:

    export HOMEBREW_NO_AUTO_UPDATE=1

例如我使用的 zsh 就修改 ~/.zprofile 增加上面这一行。
Homebrew 的安装脚本就永远不会更新了。

一点心得

Brew 作为 macOS 上最受欢迎的软件包安装工具,还是有它的设计想法在的,虽然它不直接支持安装旧版本的软件包,但可以通过切换 Formula 所在的 Git 仓库的 commit 安装旧版本的软件包。

我不太能说这是个好主意,但也给了个可以回滚的办法。

版权所有丨转载请注明出处:https://kxq.io/archives/install-package-via-brew-on-unsupported-macos