概述
Homebrew(简称 brew)是 macOS(及 Linux)上最流行的开源包管理器,用 Ruby 编写。它通过 formula(公式)定义软件包的构建规则,自动下载源码或预编译的 bottle(二进制包),安装到独立的 Cellar 目录,再 symlink 到统一的 prefix 下供系统全局使用。
核心数据:
- 仓库:
github.com/Homebrew/brew— 51,000+ commits,48.9k stars - 语言:Ruby 93.5%,Shell 4.3%
- 许可:BSD 2-Clause
- 最新版:v6.0.12(2026-07)
- 创始人:Max Howell,现任项目负责人 Mike McQuaid
核心概念速览
| 术语 | 含义 | 示例路径 |
|---|---|---|
| formula | 从源码构建的包定义 (Ruby) | .../homebrew-core/Formula/f/foo.rb |
| cask | 安装预编译应用的包定义 | .../homebrew-cask/Casks/b/bar.rb |
| prefix | Homebrew 安装根目录 | /opt/homebrew (ARM) / /usr/local (Intel) |
| keg | 某个 formula 特定版本的安装目录 | /opt/homebrew/Cellar/foo/0.1 |
| rack | 同一 formula 的多个版本 keg 的目录 | /opt/homebrew/Cellar/foo |
| Cellar | 所有 rack 的目录 | /opt/homebrew/Cellar |
| Caskroom | 所有 cask 安装目录 | /opt/homebrew/Caskroom |
| opt prefix | 指向当前活跃版本 keg 的 symlink | /opt/homebrew/opt/foo |
| tap | 第三方 formula/cask 的 Git 仓库 | /opt/homebrew/Library/Taps/homebrew/homebrew-core |
| bottle | 预编译的二进制包 | qt--6.5.1.ventura.bottle.tar.gz |
| tab | keg 的元数据(来源、选项等) | .../foo/0.1/INSTALL_RECEIPT.json |
| keg-only | 不 symlink 到 prefix 的 formula | 如 openjdk |
第一部分:行为图
用例图
展示 Homebrew 系统的三类角色及其核心用例。
用例说明:
- 普通用户:搜索、安装、升级、卸载软件;管理后台服务 (brew services);用 Brewfile 声明式管理依赖
- 开发者/维护者:创建/编辑 formula、提交 PR、审核 PR
- BrewTestBot (CI):自动构建 bottle、运行 audit 检查、上传 bottle 到 GitHub Packages
活动图 — brew install 核心流程
展示从用户执行 brew install <formula> 到安装完成的完整决策与执行路径。
时序图 — brew install 完整交互
展示一次 brew install 中各组件之间的消息传递:CLI 解析、Homebrew Core 调度、下载策略、编译系统和链接器。
状态机图 — Formula 生命周期
展示一个 formula 从其初次提交 PR 到最终被移除的完整生命周期。
第二部分:结构图
包图 — 源码顶层模块
关键模块说明:
bin/brew— 入口脚本,设置 Ruby 环境后加载Library/brew.rbLibrary/Homebrew/cmd/— 内置命令(install, uninstall, update, upgrade...)Library/Homebrew/dev-cmd/— 开发命令(如 audit, bottle, create, test...)Library/Homebrew/os/— 平台适配层(Mac / Linux),处理 OS 特定逻辑completions/— bash/zsh/fish 自动补全manpages/— man 手册页(Roff 格式)
组件图 — 生态系统架构
数据流说明:
- Formula JSON API (formulae.brew.sh) — Homebrew 4.0+ 默认从 JSON API 获取 formula 元数据,避免每次都 clone 完整的 homebrew-core Git 仓库
- GitHub Packages — bottle 上传存储位置,作为 OCI registry 提供二进制分发
- BrewTestBot — 自动化 CI,PR 提交时构建 bottle 并运行 audit
- 用户 Tap — 任何人均可创建
homebrew-*Git 仓库作为第三方 tap
类图 — 核心领域模型
Demo 代码:最小 Formula
class Foo < Formula
desc "A simple example formula"
homepage "https://example.com"
url "https://example.com/foo-1.0.tar.gz"
sha256 "abc123..."
license "MIT"
version "1.0"
depends_on "cmake" => :build
def install
system "cmake", "-S", ".", "-B", "build", *std_cmake_args
system "cmake", "--build", "build"
system "cmake", "--install", "build"
end
test do
system "#{bin}/foo", "--version"
end
end
部署图 — 文件系统布局
三平台 prefix 对比:
| 平台 | 默认 prefix | 仓库路径 |
|---|---|---|
| macOS ARM (Apple Silicon) | /opt/homebrew | /opt/homebrew |
| macOS Intel | /usr/local | /usr/local/Homebrew |
| Linux | /home/linuxbrew/.linuxbrew | /home/linuxbrew/.linuxbrew/Homebrew |
第三部分:使用手册
安装
# macOS / Linux 官方安装脚本
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装后添加到 PATH (macOS ARM)
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc
source ~/.zshrc
# 验证
brew doctor
核心命令
软件包管理
brew install <formula> # 安装 formula(默认使用 bottle)
brew install --cask <cask> # 安装 GUI 应用 (cask)
brew uninstall <formula> # 卸载
brew reinstall <formula> # 重新安装
brew upgrade [formula] # 升级所有 / 指定软件
brew pin <formula> # 锁定版本,阻止升级
brew unpin <formula> # 解锁
brew autoremove # 移除不再需要的自动依赖
brew cleanup # 清理旧版本和缓存
brew list # 列出已安装的所有 formula
brew list --cask # 列出已安装的所有 cask
brew leaves # 列出未被其他包依赖的顶层包
信息查询
brew search <keyword> # 搜索 formula/cask
brew info <formula> # 查看详细信息
brew info --json=v2 <f> # JSON 格式输出
brew deps <formula> # 查看依赖
brew deps --tree <formula> # 树状依赖图
brew desc <formula> # 查看描述
brew home <formula> # 在浏览器打开主页
brew outdated # 列出有更新的包
系统维护
brew update # 更新 Homebrew 自身及 tap
brew doctor # 诊断系统问题
brew config # 查看系统配置
brew --version # 查看版本
brew analytics off # 关闭匿名统计
服务管理 (brew services)
brew services start <f> # 启动服务并注册自启
brew services stop <f> # 停止服务并取消自启
brew services restart <f> # 重启服务
brew services list # 列出所有服务状态
brew services info <f> # 查看服务详情
Brewfile — 声明式环境管理
brew bundle dump # 导出当前安装到 Brewfile
brew bundle install # 从 Brewfile 安装所有依赖
brew bundle check # 检查是否全部安装
brew bundle cleanup # 卸载 Brewfile 中未列出的包
Brewfile 示例:
tap "homebrew/cask"
tap "user/tap"
brew "node"
brew "python@3.12"
brew "git"
brew "ffmpeg", restart_service: true
cask "google-chrome"
cask "visual-studio-code"
mas "Xcode", id: 497799835
vscode "golang.go"
vscode "ms-python.python"
服务管理原理(brew services 与 launchd)
一句话结论:brew services 只是 Homebrew 对 macOS launchd 的封装,真正调度、守护进程的是 launchd。
工作原理分三步:
- 生成 plist:
brew services start <f>把服务定义写成homebrew.mxcl.<name>.plist,放到~/Library/LaunchAgents/(用户级)或/Library/LaunchAgents/(系统级) - 注册到 launchd:通过
launchctl bootstrap(旧版load)把该 plist 加载给 launchd - launchd 接管守护:按 plist 里的
RunAtLoad(加载/开机时启动)、KeepAlive(进程退出后自动重启)等策略拉起并保活进程
本机 mysql@8.0 的真实 plist(~/Library/LaunchAgents/homebrew.mxcl.mysql@8.0.plist):
<dict>
<key>KeepAlive</key>
<true/> <!-- 进程退出后自动重启 -->
<key>Label</key>
<string>homebrew.mxcl.mysql@8.0</string> <!-- launchd 中的唯一标识 -->
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/opt/mysql@8.0/bin/mysqld_safe</string>
<string>--datadir=/opt/homebrew/var/mysql</string>
</array>
<key>RunAtLoad</key>
<true/> <!-- 加载时即启动(含开机) -->
<key>WorkingDirectory</key>
<string>/opt/homebrew/var/mysql</string>
</dict>
命令对照
| brew services | 底层机制 | 效果 |
|---|---|---|
start <f> | 写 plist + launchctl bootstrap | 立即启动,并注册开机自启 |
stop <f> | launchctl bootout + 删除 plist | 停止服务,取消自启 |
restart <f> | bootout 后重新 bootstrap | 重启服务(保留自启配置) |
run <f> | 仅本次加载,不写 plist | 只运行这一次,开机不自启 |
list | 读取 launchctl list 状态 | 列出服务运行状态 |
三层验证(本机 mysql@8.0):
brew services list→mysql@8.0 started(运行中且自启)launchctl list | grep mysql→596 homebrew.mxcl.mysql@8.0(launchd 直接管理的进程 mysqld_safe)ps aux | grep mysqld→ mysqld_safe (PID 596) 的子进程 mysqld (PID 803) 才是真正的数据库服务
常用环境变量
| 变量 | 作用 |
|---|---|
HOMEBREW_PREFIX | 安装前缀 (只读,由 brew 维护) |
HOMEBREW_CELLAR | Cellar 路径 |
HOMEBREW_REPOSITORY | brew 仓库路径 |
HOMEBREW_CACHE | 下载缓存目录 |
HOMEBREW_NO_AUTO_UPDATE | 设为 1 禁用安装前自动 brew update |
HOMEBREW_NO_INSTALL_CLEANUP | 设为 1 禁用安装后自动清理 |
HOMEBREW_NO_ANALYTICS | 设为 1 禁用匿名分析 |
HOMEBREW_NO_INSTALL_FROM_API | 设为 1 强制从本地 tap 安装而非 JSON API |
HOMEBREW_EDITOR | 指定 brew edit 使用的编辑器 |
Tap 与扩展
Tap 是第三方 formula/cask 的 Git 仓库。命名约定:homebrew-<name>。
brew tap # 列出已安装的 tap
brew tap user/repo # 添加 tap (映射到 github.com/user/homebrew-repo)
brew untap user/repo # 移除 tap
brew tap --repair # 修复 broken tap
外部命令:放在任何 PATH 上名为 brew-<cmd> 的可执行文件,或 tap 的 cmd/ 目录中的 Ruby 文件,均可作为 brew <cmd> 调用。
核心 Tap 仓库
| 仓库 | 内容 | 数 |
|---|---|---|
Homebrew/homebrew-core | 官方 formula(CLI 工具/库) | 6,000+ |
Homebrew/homebrew-cask | 官方 cask(GUI 应用) | 4,500+ |
Homebrew/homebrew-services | brew services 命令 | — |
Homebrew/homebrew-bundle | brew bundle 命令 | — |