MacOS软件包管理器--brew

摘要

  • brew是一个软件包管理器,同时支持MacOS和Linux,可以很方便地安装各种软件,比如git、node、python等。

  • brew虽然支持linux,但是实际使用中很少会使用brew来管理linux的软件包。

  • 本文介绍如何在macos下安装brew,以及如何使用brew管理各种软件包。

  • 本文的安装和命令示例基于 MacOS Intel Ventura 13.7.1,brew 版本为 4.4.8。4.5 到 7.0 的主要变化见文末「从 4.5 到 7.0」。

安装

  • 首先要确保系统中安装了 git 和 curl,对于 macOS 用户来说,这些系统都自带了,唯一需额外要求安装的是Command Line Tools (CLT) for Xcode。

1
2
3
4
5
6
7
8
# 检查系统中是否安装了 Command Line Tools (CLT) for Xcode
xcode-select --version # 能够输出版本号说明安装了,否则需要安装。

# 安装 Command Line Tools (CLT) for Xcode
xcode-select --install

# 打印当前的 Command Line Tools (CLT) for Xcode 的安装路径
xcode-select -p # /Library/Developer/CommandLineTools

在MacOS上安装brew的方法

方法一:使用脚本安装

1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
1
2
3
4
5
6
7
8
# 控制了 Homebrew 在安装软件包时是否从 Homebrew 的 API 服务器获取信息,brew4.0+ 是默认行为,无需设置
export HOMEBREW_INSTALL_FROM_API=1
# 设置brew仓库上游
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
# 设置homebrew核心上游,brew4.0+ 无需设置
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
# 设置好环境变量后再运行安装脚本
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

方法二:使用PKG文件安装

方法三:国内无法访问github地址时可以使用国内镜像源

  • 这里依旧以清华大学的Homebrew镜像源为例

1
2
3
4
5
6
7
8
# 设置brew仓库上游
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
# 设置homebrew核心上游,brew4.0+ 无需设置
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
# 从镜像下载安装脚本并安装 Homebrew / Linuxbrew
git clone --depth=1 https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/install.git brew-install
/bin/bash brew-install/install.sh
rm -rf brew-install

验证是否安装成功

  • brew 命令本身及通过brew安装的所有命令都会被软链接到/usr/local/bin/下,所以需要将该路径加入系统环境PATH中

  • 重启终端,然后执行brew -v命令查看brew的版本,如果安装成功,会输出类似如下内容

1
2
$ brew -v
Homebrew 4.4.8-40-g13c3def
  • Homebrew本身的安装位置可以通过brew --repo查看,默认为/usr/local/Homebrew

  • 通过brew安装的软件包默认会被安装到/usr/local/Cellar/下,比如git安装后会在/usr/local/Cellar/git/目录下,可以通过brew info git查看安装信息,包括依赖库等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 显示 Homebrew 安装路径,macOS ARM: /opt/homebrew,macOS Intel: /usr/local
$ brew --prefix
/usr/local

# 显示 Homebrew 本地的 Git 仓库
$ brew --repo
/usr/local/Homebrew

# 显示 Homebrew Cellar 路径,命令行工具的安装路径
$ brew --cellar
/usr/local/Cellar

# 显示 Homebrew Caskroom 路径,GUI工具的安装路径
$ brew --caskroom
/usr/local/Caskroom

# 缓存路径,下载安装包的缓存路径,通过 brew cleanup 清理
$ brew --cache
~/Library/Caches/Homebrew

配置命令补全

1
2
autoload -Uz compinit
compinit

卸载brew

1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"

常用命令

  • Homebrew 使用 formula 来构建和安装软件包(常见于命令行工具和库),使用 cask 来安装已打包的 macOS 应用程序(通常为图形界面软件)。

    • brew install xxx 安装命令行工具,这个最为常用,比如 brew install fd
    • brew install --cask xxx 安装应用(一般很少使用,更推荐官网下载安装),比如 brew install --cask firefox

    用 Homebrew 管理「命令行工具」,用官网管理「应用软件」。

  • brew的命令和参数非常多,但日常使用只需要记住常用的几个就够了,详细的命令列表可以参考Homebrew Documentation

1
2
3
4
# 查看brew支持哪些命令
brew commands
# 查看命令的帮助信息,比如
brew install --help

一些常用的命令

1
2
3
4
5
6
7
8
brew update # 更新brew到最新版本
brew --version # 查看brew的版本,可以简写为 brew -v
brew config # 查看brew的配置信息,这个命令很有用,可以查看到与brew相关的环境变量的值
brew home # 浏览器打开brew官网
brew home xxx # 浏览器打开xxx官网 如:打开fd命令的官网 brew home fd ,具体的名称可以通过brew list查看
brew cleanup # 清理缓存及日志文件,建议定期清理,当运行brew时会自动清理(2.0以后的版本)
brew cleanup -n # 显示将要清理的缓存及日志文件,只查看不删除
brew doctor # 检查是否有依赖问题,比如没有安装依赖库,或者依赖库版本过低,当运行brew报错时可以通过该命令进行检查并根据提示进行修改
  • 查看已安装的包

1
2
3
4
5
6
7
8
# 查看
brew list # 查看已安装的包
brew list --versions # 查看已安装的包及版本
brew list --versions wget # 查看已安装wget及版本
brew info xxx # 查看xxx的最新安装信息,xxx未必已经安装
brew info --cask xxx # 查看 cask 的 xxx 的最新信息,xxx未必已经安装
brew info node@22 # 看到的是这个分支上当前的补丁版本
brew edit xxx # 编辑xxx的安装脚本
  • 搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查找
brew search xxx # 查找软件包,也可以通过 https://formulae.brew.sh 网页进行搜索
## 示例
$ brew search chatgpt
==> Casks ## 提示是 应用软件
chatglm chatgpt chatgpt-atlas vincelwt-chatgpt
$ brew search nginx
==> Formulae ## 提示是命令行工具
nginx ✔ ## 后面跟个小对号表示该软件已经安装过了

# 官方同时维护的多个大版本,名字里带 @,用搜索就能列出来
$ brew search node@
==> Formulae
node@18 (disabled) node@22 node ✔
node@20 (deprecated) node@24 ode

==> Casks
nodebox

  • 安装、卸载

1
2
3
4
5
6
7
8
9
10
brew install xxx # 安装软件包,此命令相当于加上了 --formula ,安装时会自动下载依赖库,比如安装`nginx`时,会自动下载`openssl@3`和`pcre2`等
brew reinstall xxx # 重新安装,覆盖安装,会保留配置文件、数据目录、logs等用户数据

brew install node@22 # 安装官方还在维护的 @ 版本,具体会安装的版本可以通过 brew info node@22 查看

brew install --cask xxx # 安装GUI工具,比如`firefox`
brew uninstall xxx # 卸载软件包,此命令相当于加上了 --formula ,只会卸载当前包,不会卸载依赖库,这样就有可能存在很多冗余包
brew uninstall --cask xxx # 卸载GUI工具
brew autoremove # 删除所有仅作为另一个软件包的依赖项安装并且现在不再需要的包
brew autoremove --dry-run # --dry-run 仅查看哪些包可以删除,并不会真的删除
  • 升级

1
2
3
4
# 升级
brew outdated # 查看需要升级的包
brew upgrade xxx # 升级xxx到最新版
brew upgrade # 更新全部命令到最新版
  • Cask 的解压目录带版本号,例如 /usr/local/Caskroom/redis/8.4.0。自己另外建的软链接如果指到这个目录,brew upgrade 会删掉旧版本、换成新版本号,这条链接不会被 Homebrew 改掉,于是失效。/usr/local/bin/redis-server 这类由 Cask 的 binary 建的链接,升级时 Homebrew 会自己重做。

  • 例如:

1
~/develop_soft/redis8_home -> /usr/local/Caskroom/redis/8.4.0

升级完成后把 redis8_home 指到当前版本目录:

1
2
3
4
# Caskroom/redis 下面除了 .metadata,只留当前这一版
# -s 建软链接;-f 已存在就先删掉;-n 替换链接本身,不要跟进目录
ln -sfn "$(find "$(brew --caskroom)/redis" -mindepth 1 -maxdepth 1 -type d ! -name .metadata)" \
~/develop_soft/redis8_home

不要把 redis8_home 直接链到 Caskroom/redis:bin、etc、lib 在版本目录里面,不在上一层。

  • 依赖关系

1
2
3
4
5
6
7
8
# 依赖关系
brew deps --tree xxx # 树形显示包的依赖树
brew deps --installed --tree # 树形显示所有安装包的依赖关系
brew deps --installed xxx # 显示当前安装包的依赖关系,纵向展示
brew deps --installed --for-each xxx # 显示当前安装包的依赖关系,横向展示
brew uses --installed xxx # 查看已经安装的哪些工具依赖当前包
brew leaves # 查看顶级安装包,即你通过brew直接安装的包,而不是通过安装其他软件包间接安装的
brew leaves | xargs brew deps --installed --for-each --formula # 查看顶级包,并列出每个顶级包的已安装依赖
1
2
3
4
5
6
7
8
9
10
11
# 仓库管理
brew tap # 查看所有已安装的仓库,tap安装路径 /usr/local/Homebrew/Library/Taps/
brew tap user/repo # 添加一个仓库,从gitthub下载
brew tap repo_url # 添加一个仓库,从给定的仓库地址下载
brew untap user/repo # 删除一个仓库

# 从第三方仓库安装工具,此时会自动将 homebrew-ffmpeg/ffmpeg 这个仓库添加到本地
brew install homebrew-ffmpeg/ffmpeg/ffmpeg

# 更新仓库,无论是brew自己的仓库还是第三方仓库,都会自动更新
brew update
  • brew services: brew的服务管理工具,可以方便的管理通过brew安装的服务,包括启动、停止、重启服务,等等,比如nginx、redis、mysql等,具体命令可以参考Homebrew Documentation

1
2
3
4
5
6
7
8
9
10
11
# 第一次执行 services 相关的命令时会自动下载 homebrew/services,也可以 通过 brew tap homebrew/services 提前下载
# brew 4.5.0,该仓库被归档,所有功能已整合至Homebrew/brew,所以如果已经添加了 homebrew/services 仓库,则可以通过命令 brew untap homebrew/services 删除
brew services list # 查看已安装的所有服务
brew services start nginx # 启动服务,并注册到系统启动服务列表,即创建系统自启动文件: ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
brew services stop nginx # 停止服务,并从系统启动服务列表中移除,即删除系统自启动文件
brew services kill nginx # 立即杀死服务,但不从系统启动服务列表中移除
brew services restart nginx # 重启服务
brew services info nginx # 查看服务的状态和进程IP
brew services run nginx # 运行服务,但不会保存到服务列表中
brew services cleanup # 清理无效的服务,即已卸载应用的无用的配置
brew services --help # 查看帮助

brew edit: 编辑 formula / cask 的安装脚本

  • brew edit 会用 $HOMEBREW_EDITOR(未设置则回退到 $EDITOR,再没有则用 vi)打开指定软件包的安装脚本(formula 或 cask);不带参数时会打开 Homebrew 本体仓库。

  • 这是一个开发者命令(developer command),第一次执行会自动开启 Homebrew 的开发者模式:之后 brew update 会更频繁(约每小时一次,而不是每 24 小时),并且会跟踪 main 最新提交而不是稳定 tag。用 brew developer(或 brew developer state)可以确认是否已开启;用完后如果不需要开发者模式,执行 brew developer off 即可关闭。

  • 参考资料:Homebrew Documentation–Manpage、FAQ: Can I edit formulae myself?、Formula Cookbook

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 指定编辑器,推荐写到 ~/.zshrc 中永久生效
export HOMEBREW_EDITOR="code" # VS Code
# export HOMEBREW_EDITOR="vim"
# export HOMEBREW_EDITOR="subl" # Sublime Text

# 编辑 formula(命令行工具)的安装脚本,比如 fd.rb
brew edit fd
# 等同于
brew edit --formula fd

# 编辑 cask(GUI 应用)的安装脚本
brew edit --cask firefox

# 不打开编辑器,只打印脚本路径
brew edit --print-path fd
# Intel Mac 示例:
# /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/f/fd.rb

# 不带参数时,打开 Homebrew 本体仓库
brew edit

# 查看帮助
brew edit --help

brew 4.0 之后:只有官方 core / cask 的本地修改默认不生效

  • 这项限制只针对 Homebrew 官方维护的两个仓库:homebrew/core、homebrew/cask。4.0 起它们默认从 formulae.brew.sh 的 JSON API 安装,即使本地 Taps 里已经有对应的 .rb 文件,brew install / brew reinstall / brew upgrade 也会忽略这些改动。官方 FAQ 也写明:编辑 core formula / cask 时必须设置 HOMEBREW_NO_INSTALL_FROM_API=1。

  • 第三方 tap 不受 JSON API 影响。brew install user/repo/foo 仍会把仓库 clone 到 Taps 目录,之后安装、升级都读本地 Ruby 脚本,所以在这里改脚本会立刻生效,不需要设置 HOMEBREW_NO_INSTALL_FROM_API=1。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装第三方仓库的包时,会自动 clone 到 Taps
brew install homebrew-ffmpeg/ffmpeg/ffmpeg
# Intel Mac 路径示例:
# /usr/local/Homebrew/Library/Taps/homebrew-ffmpeg/homebrew-ffmpeg/

# 查看已 tap 的第三方仓库
brew tap

# 编辑第三方 formula(建议用全名,避免和 core 重名)
brew edit homebrew-ffmpeg/ffmpeg/ffmpeg
brew edit --print-path homebrew-ffmpeg/ffmpeg/ffmpeg

# 改完直接重装即可生效,不必设 HOMEBREW_NO_INSTALL_FROM_API
brew reinstall --build-from-source homebrew-ffmpeg/ffmpeg/ffmpeg
  • 注意:brew update 会对第三方 tap 做 git pull。未提交的本地修改可能被合并,也可能产生冲突;想长期保留自定义内容,更稳妥的做法是 fork 一份自己的 tap,而不是直接改别人的仓库。

  • 如果只是想看官方安装脚本怎么写,直接 brew edit xxx 即可。第一次编辑 core formula / cask 时,会自动把对应仓库 clone 到本地,但此时改完仍不会参与安装。

  • 要让官方 core / cask 的本地修改真正参与安装,需要切回“从本地仓库安装”的模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 禁止从 JSON API 安装,强制使用本地 tap 仓库
export HOMEBREW_NO_INSTALL_FROM_API=1
# 建议写入 ~/.zshrc 永久生效(仅在你需要改 formula 时)
# echo 'export HOMEBREW_NO_INSTALL_FROM_API=1' >> ~/.zshrc

# 2. 确保本地有 homebrew/core 仓库(4.0 后默认可能已被删除)
brew tap --force homebrew/core
# 如果改的是 cask
brew tap --force homebrew/cask

# 3. 编辑安装脚本
brew edit fd

# 4. 用本地脚本测试安装(formula 建议从源码编译,才能验证你改的编译参数)
HOMEBREW_NO_INSTALL_FROM_API=1 brew reinstall --build-from-source --verbose --debug fd
  • brew edit 保存退出后,终端通常会提示一句测试命令,和上面第 4 步类似。

  • 典型用途:给某个 formula 加自定义 configure 参数、临时改版本或依赖、学习官方脚本怎么写。目前 Homebrew 没有单独的“给已有 formula 传 configure 参数”的命令,只能 brew edit 后改脚本。

  • 改完如果想全部还原到官方状态:

1
2
# 丢弃 Homebrew 所有本地仓库中的未提交修改,恢复为上游状态
brew update-reset
  • 日常只装软件、不改脚本的话,不建议长期开启 HOMEBREW_NO_INSTALL_FROM_API=1,否则会失去 4.0 之后 JSON API 带来的速度优势。

brew 安装流程

  • 更新brew到最新版本:HOMEBREW_BREW_GIT_REMOTE

  • Homebrew 先看有没有对应 Bottle(与你的系统/架构匹配)

  • 如果有 Bottle → 直接下载解压:HOMEBREW_BOTTLE_DOMAIN

  • 如果没有 → 使用 Formula,从源码编译安装:HOMEBREW_API_DOMAIN

名称 作用 类比
Formula 告诉 Homebrew 如何安装软件(源码下载 + 编译步骤) 菜谱,教你怎么做这道菜
Bottle 预先编译好的二进制包,安装时直接下载 已经做好的菜,直接端上桌

配置国内镜像源

  • 上面安装部分介绍了如何在安装brew时就指定镜像源,但有些时候因为我们在安装时忘记配置,或者原来的镜像源已经失效需要重新配置,此时可以按照下面的方法进行配置。

  • 此处以配置清华镜像源为例,阿里镜像源请参考阿里的官网文档–Homebrew镜像,科大源参考Homebrew

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
## 临时替换
# 配置brew国内镜像源
$ export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
# 配置brew-core国内镜像源,4.0开始不再使用
$ export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
# 设置formula\cask的安装脚本下载源
$ export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"
# 配置brew-bottle国内镜像源
$ export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
# 更新配置,虽是临时配置,但是运行完 brew update 后,HOMEBREW_BREW_GIT_REMOTE 会永久生效,其它配置仅当前终端有效
$ brew update

## 配置永久生效,zsh用户
# 配置brew国内镜像源
$ echo 'export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"' >> ~/.zshrc
# 配置brew-core国内镜像源,4.0开始不再使用
$ echo 'export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"' >> ~/.zshrc
# 设置formula\cask的安装脚本下载源
$ echo 'export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"' >> ~/.zshrc
# 配置brew-bottle国内镜像源
$ echo 'export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"' >> ~/.zshrc
# 使配置立即生效
$ source ~/.zshrc
# 更新配置
$ brew update

# 此时查看brew配置信息,可以看到已经生效了
$ brew config
HOMEBREW_VERSION: 4.4.8-38-g6089077
ORIGIN: https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git
HEAD: 60890774e0a70fe93f94973b080068cf7b0d1c93
Last commit: 9 hours ago
Branch: master
Core tap origin: https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
Core tap HEAD: 787d1587bfa92794f7d141063a31773064ef9107
Core tap last commit: 11 minutes ago
Core tap JSON: 29 Nov 09:56 UTC
Core cask tap HEAD: 4c34bd8c418e13160fc79f1ca9312555d2edc254
Core cask tap last commit: 19 minutes ago
Core cask tap JSON: 29 Nov 09:56 UTC
HOMEBREW_PREFIX: /usr/local
HOMEBREW_API_DOMAIN: https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api
HOMEBREW_BOTTLE_DOMAIN: https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles
HOMEBREW_BREW_GIT_REMOTE: https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git
HOMEBREW_CASK_OPTS: []
HOMEBREW_CORE_GIT_REMOTE: https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
HOMEBREW_GITHUB_API_TOKEN: set
HOMEBREW_MAKE_JOBS: 12
HOMEBREW_SORBET_RUNTIME: set
Homebrew Ruby: 3.3.6 => /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/3.3.6/bin/ruby
CPU: dodeca-core 64-bit kabylake
Clang: 15.0.0 build 1500
Git: 2.43.0 => /usr/local/bin/git
Curl: 8.7.1 => /usr/bin/curl
macOS: 13.7.1-x86_64
CLT: 15.0.0.0.1.1694021235
Xcode: N/A

# 通过brew升级fd,可以看到使用了清华源
$ brew upgrade fd
==> Upgrading 1 outdated package:
fd 8.2.1 -> 10.2.0
==> Fetching fd
==> Downloading https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/fd-10.2.0.ventura.bottle.tar.gz
################################################################################################################################################################################### 100.0%
==> Verifying attestation for fd
==> Upgrading fd
8.2.1 -> 10.2.0
==> Pouring fd-10.2.0.ventura.bottle.tar.gz
==> Caveats
zsh completions have been installed to:
/usr/local/share/zsh/site-functions
==> Summary
🍺 /usr/local/Cellar/fd/10.2.0: 14 files, 2.9MB
==> Running `brew cleanup fd`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
Removing: /usr/local/Cellar/fd/8.2.1... (13 files, 2.4MB)
  • 恢复为默认的GitHub镜像源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
$ unset HOMEBREW_BREW_GIT_REMOTE
$ unset HOMEBREW_CORE_GIT_REMOTE
$ unset HOMEBREW_API_DOMAIN
$ unset HOMEBREW_BOTTLE_DOMAIN

# 如果您之前永久配置了 HOMEBREW 环境变量,还需要在对应的 ~/.bash_profile 或者 ~/.zshrc 配置文件中,将对应的 HOMEBREW 环境变量配置行删除
$ source ~/.zshrc

# 更新brew
$ git -C "$(brew --repo)" remote set-url origin https://github.com/Homebrew/brew
# 更新brew-core,brew4.0后不会再下载brew-core,所以可以忽略
# 不过从低版本升级上来的还会有这个仓库,可以通过 brew tap 查看是否存在,实际上改不改都不会有影响,看着不舒服就修改吧
$ git -C "$(brew --repo homebrew/core)" remote set-url origin https://github.com/Homebrew/homebrew-core
$ brew update

# 查看brew配置信息
$ brew config
HOMEBREW_VERSION: 4.4.8-38-g6089077
ORIGIN: https://github.com/Homebrew/brew
HEAD: 60890774e0a70fe93f94973b080068cf7b0d1c93
Last commit: 9 hours ago
Branch: master
Core tap HEAD: 787d1587bfa92794f7d141063a31773064ef9107
Core tap last commit: 13 minutes ago
Core tap JSON: 29 Nov 10:09 UTC
Core cask tap HEAD: 871fe2e8b93aac896a1808571ff11f8b89e6d90e
Core cask tap last commit: 48 seconds ago
Core cask tap JSON: 29 Nov 10:09 UTC
HOMEBREW_PREFIX: /usr/local
HOMEBREW_CASK_OPTS: []
HOMEBREW_GITHUB_API_TOKEN: set
HOMEBREW_MAKE_JOBS: 12
HOMEBREW_SORBET_RUNTIME: set
Homebrew Ruby: 3.3.6 => /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/3.3.6/bin/ruby
CPU: dodeca-core 64-bit kabylake
Clang: 15.0.0 build 1500
Git: 2.43.0 => /usr/local/bin/git
Curl: 8.7.1 => /usr/bin/curl
macOS: 13.7.1-x86_64
CLT: 15.0.0.0.1.1694021235
Xcode: N/A

# 通过brew升级telnet,可以看到使用了GitHub源
$ brew upgrade telnet
==> Upgrading 1 outdated package:
telnet 294 -> 303.141.1
==> Downloading https://ghcr.io/v2/homebrew/core/telnet/manifests/303.141.1
################################################################################################################################################################################### 100.0%
==> Fetching telnet
==> Downloading https://ghcr.io/v2/homebrew/core/telnet/blobs/sha256:1be6b7b6a17a311fb3a2f1bffe7dae52284f3239b8af03f651c4fac11362f702
################################################################################################################################################################################### 100.0%
==> Verifying attestation for telnet
==> Upgrading telnet
294 -> 303.141.1
==> Pouring telnet--303.141.1.ventura.bottle.tar.gz
🍺 /usr/local/Cellar/telnet/303.141.1: 5 files, 207.5KB
==> Running `brew cleanup telnet`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
Removing: /usr/local/Cellar/telnet/294... (4 files, 208.2KB)

Homebrew 常用的环境变量

环境变量 默认值 作用 / 用途 备注
HOMEBREW_EDITOR $EDITOR 或 vi 指定 Homebrew 默认编辑器,用于 brew edit xxx 可以设置为 subl, code, vim 等
HOMEBREW_BREW_GIT_REMOTE https://github.com/Homebrew/brew.git 指定 Homebrew 核心仓库 Git 源,即brew命令本身 常用国内镜像,如阿里云 https://mirrors.aliyun.com/homebrew/brew.git
HOMEBREW_CORE_GIT_REMOTE https://github.com/Homebrew/homebrew-core.git Homebrew Core 仓库 Git 源 ,4.0 后不再使用 国内镜像可设置为阿里云等
HOMEBREW_API_DOMAIN https://formulae.brew.sh/api Formula / Cask 元数据下载源 国内镜像可设置,如阿里云 https://mirrors.aliyun.com/homebrew-bottles/api
HOMEBREW_BOTTLE_DOMAIN https://homebrew.bintray.com(旧)/ 官方默认 bottles 域 指定 bottle 二进制包下载源 国内镜像可设置,如阿里云 https://mirrors.aliyun.com/homebrew/homebrew-bottles
HOMEBREW_CASK_OPTS [] 设置 Cask 软件安装选项 常用示例:--appdir=/Applications
HOMEBREW_DOWNLOAD_CONCURRENCY CPU 核心数的一半 设置下载并发数 4.6.0添加,可以加快多文件下载速度
HOMEBREW_MAKE_JOBS CPU 核心数 编译源码时的 make 并发数 可根据 CPU 调整,减少编译失败
HOMEBREW_FORBID_PACKAGES_FROM_PATHS 未设置 防止从本地路径安装 formula 出于安全考虑,建议保留
HOMEBREW_GITHUB_API_TOKEN 未设置 提升 GitHub API 访问限额(匿名用户 60 次/h → 5000 次/h) 必须为 GitHub PAT,可不选权限 scopes
HOMEBREW_SORBET_RUNTIME 未设置 开发者模式下启用 Ruby Sorbet 类型检查 runtime 普通用户可忽略 / unset
HOMEBREW_DEVELOPER 未设置 是否开启 Homebrew Developer Mode brew developer on/off 控制
HOMEBREW_NO_AUTO_UPDATE 未设置 禁止 brew 命令自动 update 可以防止在运行brew install、brew upgrade、brew reinstall 等命令时自动执行一次 brew update
HOMEBREW_VERBOSE 未设置 输出详细调试信息 调试 brew install 或编译失败时有用

HOMEBREW_GITHUB_API_TOKEN

  • 如果使用brew默认的github镜像源,建议增加该环境变量

  • 在你的GitHub账号中创建一个 PAT(Personal Access Token),无需授予任何权限,该token仅用于 brew 访问 GitHub API 时的身份验证。

  • brew 在执行 brew update、brew search、brew info、brew upgrade 以及 brew install(当需要从 GitHub 仓库下载 Formula 或 Cask 时)都会触发 GitHub API 请求

  • 作用:提升 GitHub API 访问限额(匿名用户 60 次/h → 5000 次/h)

HOMEBREW_DEVELOPER

  • “开发者模式(developer mode)”,官方推荐通过 brew developer on/off 控制开启和关闭,不要直接修改环境变量 HOMEBREW_DEVELOPER=1

  • brew developer on/off 会做三件事

    • 写入或删除 Homebrew 内部标记(devcmdrun)
    • 让部分行为更一致(例如 brew update 跟踪 main 而不是稳定 tag)
    • 确保各类开发者功能完全启用/禁用

如何确认开发者模式是否开启

  • 直接执行 brew developer(等价于 brew developer state),看输出即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看当前状态
brew developer
# 等价于
brew developer state

# 已开启(因为执行过 brew edit 等开发者命令,或手动 brew developer on)
# Developer mode is enabled because a developer command or `brew developer on` was run.
# `brew update` will update to the latest commit on the `main` branch.

# 已开启(因为环境变量 HOMEBREW_DEVELOPER 被设置)
# Developer mode is enabled because HOMEBREW_DEVELOPER is set.

# 未开启
# Developer mode is disabled.
# `brew update` will update to the latest stable tag.
  • 注意:即便终端里没有 HOMEBREW_DEVELOPER 这个环境变量,开发者模式也可能是开着的。brew edit、brew create 这类开发者命令会写入内部标记,不依赖该环境变量。所以不要用 echo $HOMEBREW_DEVELOPER 来判断,以 brew developer 的输出为准。

  • 辅助判断:brew config 里如果 Branch: main,通常表示正在跟踪最新提交;稳定用户一般对应某个 tag。这只能作旁证,状态仍以 brew developer 为准。

1
2
3
4
# 关闭开发者模式
brew developer off
# 如果输出提示还要 unset HOMEBREW_DEVELOPER,说明环境变量也开着,需要一并去掉
# unset HOMEBREW_DEVELOPER

开发者模式的主要作用

  • 启用更多开发/调试命令

命令 说明
brew edit 用编辑器打开 formula / cask 安装脚本
brew audit 审查 formula 是否符合规范
brew create 生成新的 formula 模板
brew release-notes 生成发布说明
brew tests 运行开发者测试
brew ruby 用 Ruby 运行 Homebrew 内部脚本
brew style 执行 RuboCop 检查代码风格
  • 显示更多调试信息 & 并关闭某些用户友好优化

    • 更详细的错误日志输出
    • 禁用某些缓存优化(例如 formula 缓存)
    • 显示更详细的 curl / git / sandbox 信息
    • 某些情况下启用更严格的行为(如 stricter audit)
  • 可以避免某些“稳定版限制”

    • 开发者模式允许安装一些未完全稳定、未正式发布的内容
    • 允许访问 Homebrew 的内部 tap 工作流程
    • 在不破坏本地 Brew 的情况下测试官方仓库 PR
  • 在开发 Formula 或调试 Homebrew 时非常重要

    • 轻松创建 formula (brew create)
    • 运行 brew audit --strict 查看更严格的规范检查
    • 调试变化中的 Homebrew 本体代码(brew/ 目录)
    • 查看 Homebrew 内部 Ruby 执行过程

❗ 什么时候应该开启 HOMEBREW_DEVELOPER?

  • 仅建议在以下情况下启用:

    • 你要编写自定义 Formula / Cask
    • 你要给 Homebrew 官方贡献 PR
    • 你需要调试 Homebrew 行为
    • 你要分析 Homebrew 的内部实现逻辑
  • 如果你只是“普通用户,用来安装软件”,不建议设置,因为:

    • 会输出更多日志
    • 会激活一些你用不到的功能
    • 可能导致行为与官方普通用户不一致

重要的说明

环境变量

  • brew安装的软件包会被软连接到/usr/local/bin/下,所以需要将该路径加入系统环境PATH中

  • 这里要注意一点,如果该路径在PATH中声明的比较靠前,就可能会被优先使用,比如我们已经手工在系统中安装了python的某个版本,但通过brew安装某些软件包时因为其依赖python,就会通过brew同时安装对应的python版本,此时我们在使用python命令时,就会优先使用这个

  • 有两种方法可以解决,1是通过brew unlink python来解除链接,此时并不是删除,而只是解除了软链,不会影响依赖它的工具的使用,如果需要恢复链接,可以通过brew link python来恢复链接;2是将我们的系统中自己安装的一些工具的路径声明在/usr/local/bin/之前,这样就不会有影响了。

Homebrew 4.0 带来的新变化

  • Homebrew 4.0 进行了一项最大的改动,组织方式从Git仓库管理改为JSON文件下载。以前 Homebrew 安装时是“去拿一个 git 仓库 + 运行脚本”,现在是“下载一个大 JSON 数据库 + 直接用 metadata 安装/查 info”。

  • 在你看到的 formula.jws.json、cask.jws.json、formula_tap_migrations.jws.json、cask_tap_migrations.jws.json,以及类似的 *.json 文件,其实是 Homebrew 用来统一、集中分发 “formula 和 cask 的元数据(metadata)” 的文件。

文件名 (或类型) 用途 / 含义
formula.jws.json 包含所有(或大部分)“core formula”(即主仓库 homebrew-core) 的 metadata 集合,用于安装/查询 formula。
cask.jws.json 类似 formula.jws.json,但专门针对 GUI/应用程序类的 cask(来自 homebrew-cask 仓库)的 metadata。
formula_tap_migrations.jws.json 记录那些从 core tap 中“迁移 (migrate/move)”出去的 formula —— 比如某 formula 不再属于 core,而被移到别的 tap 或 cask。让 Homebrew 能提示用户 “这个 formula 已经移走了,现在应该在别处”。 (ReadMex)
cask_tap_migrations.jws.json 对应 cask 的迁移 / 重命名 / tap 变动记录。
  • 更具体地说,当你用 brew install <formula> 或 brew info、brew search 等命令时,Homebrew 将不必总是从本地克隆(git) 的 tap 仓库里读取 Ruby 脚本,而是可以直接下载这些 JSON 文件 —— JSON-API —— 来获得 formula/cask 的名称、版本、依赖关系、描述 (description)、homepage、以及其它 metadata(比如以瓶装包 “bottle” 安装、analytics 数据、重命名/迁移信息等)。

  • JSON文件会从formulae.brew.sh下载,而不再使用homebrew/core、homebrew/cask两个仓库,所以升级到4.0后,本地的homebrew/core、homebrew/cask 仓库都可以删除以释放磁盘空间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看本地仓库
$ brew tap
homebrew/cask # cask 仓库,GUI的工具会从此下载,brew4.0后不再使用
homebrew/core # core 仓库,即 formula 仓库,命令行工具会从此下载,brew4.0后不再使用
homebrew/services # 4.0 时还要单独 tap;4.5 起 brew services 已内置,这个仓库可以 untap

# 删除本地仓库
$ brew untap homebrew/core
$ brew untap homebrew/cask

# 此时再次执行 brew outdated 等命令时,会看到json文件被下载了,默认情况下,该json文件间隔24小时更新一次
$ brew outdated
==> Downloading https://formulae.brew.sh/api/formula.jws.json
##################################################################################### 100.0%
==> Downloading https://formulae.brew.sh/api/cask.jws.json
##################################################################################### 100.0%

## brew5.0+会看到如下输出:
✔︎ JSON API formula_tap_migrations.jws.json [Downloaded 2.1KB/ 2.1KB]
✔︎ JSON API cask_tap_migrations.jws.json [Downloaded 2.4KB/ 2.4KB]
✔︎ JSON API cask.jws.json [Downloaded 15.0MB/ 15.0MB]
✔︎ JSON API formula.jws.json [Downloaded 31.7MB/ 31.7MB]
  • 如果还想使用旧的仓库模式,只要配置下环境变量

1
echo 'export HOMEBREW_NO_INSTALL_FROM_API=1' >> ~/.zshrc

从镜像源的切换来理解brew下载安装包的过程

  • 前面我们介绍过,切换镜像源时要设置4个环境变量,那么为什么要设置这几个变量呢?它们的作用是什么呢,下面我就一个一个说明:

    • HOMEBREW_BREW_GIT_REMOTE

      • 设置brew仓库,用于更新brew命令本身,这个比较容易理解
    • HOMEBREW_CORE_GIT_REMOTE

      • 设置core仓库,用于更新formula的安装脚本
      • 当通过brew info xxx查看安装包信息时,可以看到From信息,这个就是命令的安装脚本,比如下面的fd.rb
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      $ brew info fd
      ==> fd: stable 10.2.0 (bottled), HEAD
      Simple, fast and user-friendly alternative to find
      https://github.com/sharkdp/fd
      Conflicts with:
      fdclone (because both install `fd` binaries)
      Installed
      /usr/local/Cellar/fd/10.2.0 (14 files, 2.9MB) *
      Poured from bottle using the formulae.brew.sh API on 2024-11-29 at 18:02:16
      From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/f/fd.rb
      License: Apache-2.0 OR MIT
      ==> Dependencies
      Build: rust ✘
      ==> Options
      --HEAD
      Install HEAD version
      ==> Caveats
      zsh completions have been installed to:
      /usr/local/share/zsh/site-functions
      ==> Analytics
      install: 6,327 (30 days), 24,518 (90 days), 116,476 (365 days)
      install-on-request: 6,326 (30 days), 24,515 (90 days), 116,363 (365 days)
      build-error: 0 (30 days)
      • 这个安装脚本中包含bottle do部分,其作用是当安装脚本时,优先从该部分获取对应的操作系统的二进制预编译包的sha256校验值,如果从对应的二进制源中找到,则直接从二进制预编译包的地址进行下载,该预编译下载地址由HOMEBREW_BOTTLE_DOMAIN指定,默认从官方源下载。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      class Fd < Formula
      desc "Simple, fast and user-friendly alternative to find"
      homepage "https://github.com/sharkdp/fd"
      url "https://github.com/sharkdp/fd/archive/refs/tags/v10.2.0.tar.gz"
      sha256 "73329fe24c53f0ca47cd0939256ca5c4644742cb7c14cf4114c8c9871336d342"
      license any_of: ["Apache-2.0", "MIT"]
      head "https://github.com/sharkdp/fd.git", branch: "master"

      bottle do
      sha256 cellar: :any_skip_relocation, arm64_sequoia: "9d17cfb029fbdc6ed31c732108f7aa746d3082dd4783ed35471ef79340615509"
      sha256 cellar: :any_skip_relocation, arm64_sonoma: "82d5c2ffc2e2d0d8643a7c3f620c81ed49d7b23920aa23b6a7f4c50be69abc0b"
      sha256 cellar: :any_skip_relocation, arm64_ventura: "354412ababb7d6c52abd9153ff96f133391406ce292b2122c76b96c2ab714f87"
      sha256 cellar: :any_skip_relocation, arm64_monterey: "0b41f292041767fd1c3c5b92daaa6c823fb07c1d7cd11b0427a415f08463f035"
      sha256 cellar: :any_skip_relocation, sonoma: "4fa0fb4b3f512e45d35c569953efc7c59ebd8976caac9b2c1b1394b7e29157a0"
      sha256 cellar: :any_skip_relocation, ventura: "b1406e5414252b1e1b90cfad188454eb31058256ed6246baed48c4e1cfe593a1"
      sha256 cellar: :any_skip_relocation, monterey: "0ac060bf7d1529aa1f65e634f64b98b906df533d71f2185c883165c01f59ad53"
      sha256 cellar: :any_skip_relocation, x86_64_linux: "2464fb21cc981166ffa9783fa14a09265790af4d89ce3a763421ddaf29119541"
      end

      depends_on "rust" => :build

      conflicts_with "fdclone", because: "both install `fd` binaries"

      def install
      system "cargo", "install", *std_cargo_args
      man1.install "doc/fd.1"
      generate_completions_from_executable(bin/"fd", "--gen-completions", shells: [:bash, :fish])
      zsh_completion.install "contrib/completion/_fd"
      # Bash completions are not compatible with Bash 3 so don't use v1 directory.
      # bash: complete: nosort: invalid option name
      # Issue ref: https://github.com/clap-rs/clap/issues/5190
      (share/"bash-completion/completions").install bash_completion.children
      end

      test do
      touch "foo_file"
      touch "test_file"
      assert_equal "test_file", shell_output("#{bin}/fd test").chomp
      end
      end
      • 注意,brew4.0后不再使用从该git仓库中获取安装脚本,因为formula的安装源代码已经全部存储在json文件中(见HOMEBREW_API_DOMAIN说明),不再需要通过Git仓库下载
      • 切换镜像源时,brew4.0后不需要设置该环境变量
    • HOMEBREW_API_DOMAIN

      • 设置formula\cask的安装脚本下载源,默认https://formulae.brew.sh
      • brew4.0后不再从git仓库获取安装脚本,而是从这个json文件中一次性获取所有工具的安装脚本,默认24小时更新一次
      1
      2
      3
      4
      5
      6
      7
      官方源:
      formula源:https://formulae.brew.sh/api/formula.jws.json
      cask源:https://formulae.brew.sh/api/cask.jws.json

      清华源:
      formula源:https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api/formula.jws.json
      cask源:https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api/cask.jws.json
      • 如果还想使用旧的仓库模式,只要配置下环境变量,这样即使你升级后已经删除了对应的仓库,它也会在第一次使用到时自动下载
      1
      2
      # 官方也提到,非开发人员没必要这样做
      echo 'export HOMEBREW_NO_INSTALL_FROM_API=1' >> ~/.zshrc
    • HOMEBREW_BOTTLE_DOMAIN

      • 指定预编译二进制包(也称为 bottles)的下载地址,Homebrew 使用这些 bottles 来加速软件安装过程,避免在每个用户的计算机上都重新从源代码构建软件。
      • 当我们通过brew install xxx安装软件时,brew会先从该formula的安装脚本(4.0以前从HOMEBREW_CORE_GIT_REMOTE指定的git仓库获取,4.0以后从HOMEBREW_API_DOMAIN指定的json文件中获取)中获取该软件的安装信息,然后根据安装信息从bottle中下载对应的预编译二进制包,再将其安装到本地。
      • 下载后的二进制包会被保存到缓存目录中(brew --cache),安装后的软件包存储到Cellar目录中(brew --cellar)
  • 通过上面的分析,我们可以得出结论,切换镜像源时,实际上只需要设置3个变量就够了

1
2
3
HOMEBREW_BREW_GIT_REMOTE
HOMEBREW_API_DOMAIN
HOMEBREW_BOTTLE_DOMAIN

从 4.5 到 7.0

  • 上面的用法按 Homebrew 4.4.8 写。下面只记各次大版本里和安装、升级、系统支持有关的变化,材料来自官方博客:4.5.0、4.6.0、5.0.0、5.1.0、6.0.0、7.0.0。brew update 会把本机的 brew 升到当前稳定版。

4.5.0(2025-04-29)

  • brew bundle 和 brew services 收进 Homebrew 本体,不再依赖外部 tap。已经 brew tap homebrew/services 的可以 brew untap homebrew/services。

  • 一部分 Cask 开始能在 Linux 上装,主要是字体和带 Linux 二进制的包。macOS 专用的 .app 仍然没有。

  • 写出了 Support Tiers:Tier 1 有预编译 bottle 和 CI。brew doctor 会链到这份说明。

  • 运行 Homebrew 需要 Ruby 3.4,并默认打开 Bootsnap,重复执行 brew 会快一些。

  • 新增可选开关 brew install --ask,先列出将要安装的包、依赖和体积,确认后才下载。6.0 起这成为默认行为,7.0 起再写 --ask 会报错,见下面两节。brew update-if-needed 在不需要自动更新时什么也不做。

4.6.0(2025-08-05)

  • 并行下载先做成可选:export HOMEBREW_DOWNLOAD_CONCURRENCY=auto。5.0 起这成为默认。

  • 开始初步支持 macOS 26(Tahoe),正式支持要等苹果公开发布之后。

  • 内置 brew mcp-server,给支持 MCP 的编辑器查询 Homebrew。说明见 Homebrew’s MCP Server。

5.0.0(2025-11-12)

  • 并行下载默认打开。要关回串行:export HOMEBREW_DOWNLOAD_CONCURRENCY=1。

  • Linux ARM64 升到 Tier 1,和 Apple Silicon、主流 Linux x86_64 一样提供 bottle。

  • macOS 26(Tahoe)成为正式支持的系统。

  • 没通过 Gatekeeper 签名检查的官方 Cask 被标记为废弃,计划在 2026 年 9 月禁用。

  • 支持时间表:2026 年 9 月起不再支持 macOS Catalina 10.15 及更早,Intel Mac 降到 Tier 3,不再为 Intel 编新的 bottle;2027 年 9 月起 Intel 上不再运行 Homebrew,Apple Silicon 上的 macOS 11 也不再支持。

5.1.0(2026-03-10)

  • brew version-install <formula> <version> 可以按旧版本号取出并安装,不必自己翻 git 历史。

  • brew bundle 的 Brewfile 可以声明 Cargo、uv、Flatpak。

  • 出现 ffmpeg-full、imagemagick-full 这类带全部可选功能的 formula。没装同名普通包时,版本号包和 -full 包可以自动链接进 PATH。

  • 自带的 Portable Ruby 升到 4.0。

6.0.0(2026-06-11)

  • brew install、brew upgrade、brew reinstall 默认先打印安装计划。计划里还有依赖、被其他包依赖的项,或命令行点名之外的包时,才会停下来等确认;否则只打印计划。终端不是交互式时也不问。此时再写 --ask 只会警告。要跳过确认:brew install --no-ask(-y、--yes 相同),或 export HOMEBREW_NO_ASK=1。

  • 第三方 tap 要先信任才会执行里面的 Ruby。官方 homebrew/core、homebrew/cask 默认信任。相关命令是 brew trust。没信任的 tap 不会再因为 brew install user/repo/foo 被自动 clone 后直接运行。

  • 默认改用更小的 internal JSON API,一次下载汇总元数据。5.0 里用来打开它的 HOMEBREW_USE_INTERNAL_API 就此废弃。

  • Linux 上构建、测试、安装后步骤默认进 Bubblewrap 沙箱,和 macOS 上已有的沙箱对齐。7.0 又换成了不依赖额外组件的 Landlock。

  • glibc 低于 2.39 的 Linux(例如 Ubuntu 22.04)降为 Tier 2,不再编新的 bottle。brew doctor 会提示。

  • 新增 brew exec,在某个 formula 的环境里跑命令,用法接近 npx。brew vulns 用来查已安装包的已知漏洞,7.0 把这类检查收进了本体。

  • Formula 的 post_install、Cask 的 preflight / postflight 开始改成可放进 JSON 的 *_steps。官方仓库要求用新写法;个人 tap 里的旧块在 7.0 起标记为废弃,计划 2027-12-11 停用。细节见 brew -- 创建自己的 Formula 和 brew -- 创建自己的 Cask。

  • 开始初步支持 macOS 27(Golden Gate)。这个系统不再支持 Intel。

7.0.0(2026-09-13)

  • brew install、brew reinstall、brew upgrade 会把下载和安装重叠起来,一次装多个包时不用等上一个完全结束才开始下一个。brew bundle 也走同一套。

  • --ask 和 HOMEBREW_ASK 被禁用。再执行 brew install --ask 会报 Calling the --ask switch is disabled! Use the default behaviour instead. 直接运行 brew install color_echo 就已经会先列出计划。Intel Mac 属于 Tier 3,这条报错后面还会附上 Support Tiers 的说明,提醒不要往 Homebrew 仓库报 issue。

  • Intel Mac、macOS Sonoma 14 降为 Tier 3:旧 bottle 还在,但不再例行为这些系统编新包。macOS Catalina 10.15 及更早已经不能跑 Homebrew。Apple Silicon 上的 Sequoia 15、Tahoe 26、Golden Gate 27 是 Tier 1。

  • macOS 的 .pkg 安装包只提供给 Apple Silicon,并且要求 macOS Sequoia 15 或更新。装 Cask 不再要求先装 Xcode Command Line Tools。

  • 图形界面 BrewUI:macOS Tahoe 26 或更新的系统上执行 brew install homebrew-app。它会把实际执行的 brew 命令显示出来。

  • Formula 和 Cask 提供同名命令时,链接以 Formula 为准,并提示怎样改回 Cask 的链接。brew link / brew unlink 可以加 --cask。

  • Linux 沙箱从 Bubblewrap 换成 Landlock。内核没有 Landlock 时仍能安装,只是没有这层沙箱,brew doctor 会提示。

  • brew install --dry-run 可以同时预览 formula 和 cask。brew untap 会询问要不要先卸掉这个 tap 已经装上的包。

记录一次MacOS升级后导致vim不可用的解决过程

    1. 升级MacOS后,vim不可用,提示如下错误:
1
2
3
4
5
~ vim
dyld[6281]: Library not loaded: /System/Library/Perl/5.30/darwin-thread-multi-2level/CORE/libperl.dylib
Referenced from: <F514D59D-E833-374C-9894-C0FAD0F7FF8E> /usr/local/Cellar/vim/9.1.1400/bin/vim
Reason: tried: '/System/Library/Perl/5.30/darwin-thread-multi-2level/CORE/libperl.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/System/Library/Perl/5.30/darwin-thread-multi-2level/CORE/libperl.dylib' (no such file), '/System/Library/Perl/5.30/darwin-thread-multi-2level/CORE/libperl.dylib' (no such file, not in dyld cache), '/usr/local/lib/libperl.dylib' (no such file), '/usr/lib/libperl.dylib' (no such file, not in dyld cache)
[1] 6281 abort vim
    1. 这是 macOS 升级后常见的 Vim 运行报错,原因是:
    • 你之前安装的 Vim(Homebrew 版本)是链接到旧系统的 Perl 库 /System/Library/Perl/5.30/…
    • 升级系统后这个库路径已经不存在了,所以运行 vim 时动态链接失败。
    1. 解决办法:重新安装 Vim
1
2
3
4
5
6
7
8
9
# 删除缓存,避免旧版本的残留文件阻塞继续安装
brew cleanup
rm -rf ~/Library/Caches/Homebrew
# 升级brew
brew update
# 重新安装vim,这里最好用 reinstall 而不是 upgrade,因为当前 Vim 已经失效。
brew reinstall vim
# 验证安装成功
vim --version