Homebrew 的诞生背景

刚接触 macOS 时,安装软件似乎并不复杂:打开浏览器、进入官网、下载 DMG 文件,再把应用拖进“应用程序”目录即可。

但当我们开始搭建开发环境,事情很快就会变得麻烦。Git、Node.js、wget、Redis 等工具来自不同的网站,各自有不同的安装方式;软件升级后,旧版本和配置文件也可能散落在系统的不同位置。换一台 Mac,又要把这套流程重新走一遍。

Linux 很早就有 apt、yum 等包管理器,可以用一条命令完成软件的搜索、安装、升级和卸载。macOS 虽然也有 MacPorts、Fink 等工具,却没有一个由系统提供、面向开源软件的统一包管理器。

Homebrew 正是在这样的背景下出现的。它最初由 Max Howell 创建,希望用一套简单的命令管理 macOS 缺少的软件。它没有把文件随意塞进系统目录,而是把每个软件安装到独立位置,再通过软链接把可执行文件放进统一的搜索路径。

这也是名字中 “Homebrew” 的含义:像在家酿啤酒一样,用自己的方式为 Mac 补齐需要的工具。它的主命令 brew,也一直沿用了这套啤酒主题。

Homebrew 是什么

Homebrew 是一个开源的包管理器。对使用者来说,它最直接的价值是把寻找安装包、处理依赖、配置路径、检查更新和卸载软件这些操作,统一成一组 brew 命令。

例如,安装 wget 只需要执行:

1
brew install wget

安装 Visual Studio Code 也只需要一条命令:

1
brew install --cask visual-studio-code

在继续使用之前,可以先认识四个经常出现的概念:

  • Formula:软件的安装配方,主要用于命令行工具、开发库和后台服务,例如 wget、Git、Redis。
  • Cask:主要用于安装带有图形界面的 macOS 应用,例如 Visual Studio Code、Firefox。
  • Bottle:Homebrew 预先构建好的二进制包。使用 Bottle 可以省去本地编译的时间。
  • Tap:软件配方的来源,可以理解为额外的软件仓库。Homebrew 有官方仓库,软件开发者和其他用户也可以维护第三方 Tap。

Homebrew 会把 Formula 安装到自己的 Cellar 中,再将需要使用的文件链接到 Homebrew 的安装目录。Apple Silicon Mac 默认安装在 /opt/homebrew,Intel Mac 默认安装在 /usr/local。使用默认目录,通常才能直接使用官方提供的 Bottle。

安装 Homebrew

安装前,建议先打开“终端”,安装或确认 Xcode Command Line Tools:

1
xcode-select --install

如果系统提示已经安装,可以直接进行下一步。

Homebrew 官网 复制安装命令并执行:

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

这条命令会先下载安装脚本,然后交给 Bash 执行。脚本在真正修改系统前会说明准备进行的操作,并等待用户确认。安装过程中可能会要求输入当前账户的密码,这是为了创建安装目录等必要操作;输入密码时终端不会显示字符,正常输入并按回车即可。

安装结束后,不要急着关闭终端。安装程序通常会在 Next steps 中给出配置环境变量的命令,应优先复制并执行它提供的内容。

Apple Silicon Mac 通常需要执行:

1
2
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

Intel Mac 对应的路径通常是 /usr/local/bin/brew

1
2
echo 'eval "$(/usr/local/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/usr/local/bin/brew shellenv)"

brew shellenv 会把 Homebrew 需要的路径加入当前 Shell 环境。第一条命令将配置写入 ~/.zprofile,保证以后打开终端时仍然生效;第二条命令让配置立即在当前终端生效。

最后检查安装结果:

1
2
3
brew --version
brew --prefix
brew doctor

brew --prefix 可以确认当前 Homebrew 的安装位置;brew doctor 会检查环境并给出建议。看到 Warning 不一定代表 Homebrew 无法使用,应先阅读具体内容,再判断是否需要处理。

安装第一个软件

假设现在需要安装 wget。与其先去搜索引擎寻找安装包,不如直接让 Homebrew 搜索:

1
brew search wget

安装前可以查看软件版本、依赖、主页等信息:

1
brew info wget

确认无误后进行安装:

1
brew install wget

安装结束后验证是否可用:

1
wget --version

命令行工具之外,Homebrew 也能管理图形应用。例如安装 Visual Studio Code:

1
2
3
brew search visual-studio-code
brew info --cask visual-studio-code
brew install --cask visual-studio-code

Homebrew 会下载应用并把它安装到 macOS 的“应用程序”目录。以后迁移到新 Mac 时,就不必再逐个打开官网下载安装包了。

查看已经安装的 Formula 和 Cask,可以分别执行:

1
2
brew list --formula
brew list --cask

常用操作

日常使用 Homebrew,最容易混淆的是更新 Homebrew 和升级软件。

1
2
3
4
5
6
7
8
9
10
11
# 更新 Homebrew 自身以及可用软件的信息
brew update

# 查看哪些软件存在新版本
brew outdated

# 升级一个软件
brew upgrade wget

# 升级所有可以升级的软件
brew upgrade

brew update 更新的是 Homebrew 的数据,不等于升级已经安装的软件。执行全量 brew upgrade 前,最好先通过 brew outdated 查看清单,确认新版本不会影响正在使用的开发环境。

软件出现异常时,可以尝试重新安装:

1
brew reinstall wget

不再需要的软件可以卸载:

1
2
brew uninstall wget
brew uninstall --cask visual-studio-code

Homebrew 会保留一部分旧版本和下载缓存。可以先预览待清理内容,再执行清理:

1
2
brew cleanup --dry-run
brew cleanup

如果想了解软件之间的依赖关系,可以使用:

1
2
3
4
5
# 查看某个软件依赖了什么
brew deps redis

# 查看哪些已安装的软件使用了它
brew uses --installed openssl@3

遇到问题时,下面几个命令通常比直接删除目录更有帮助:

1
2
3
brew config
brew doctor
brew update

其中 brew config 会输出 Homebrew、macOS、CPU 架构和开发工具等环境信息,适合在排查问题时留存。

管理后台服务

Redis、MySQL、PostgreSQL 这类软件除了需要安装,还需要启动后台进程。Homebrew 可以通过 brew services 统一管理它们。

以 Redis 为例:

1
2
brew install redis
brew services start redis

不带 sudo 执行 brew services start 时,Homebrew 会为当前用户启动服务,并注册为登录后自动启动。

常用的服务管理命令如下:

1
2
3
4
5
6
7
8
9
10
11
# 查看服务状态
brew services list

# 重启服务
brew services restart redis

# 停止服务,并取消登录后自动启动
brew services stop redis

# 只运行服务,不注册为登录后自动启动
brew services run redis

如果只是本地开发,通常使用当前用户级别的服务就够了,不需要加 sudo 把它注册成系统级服务。

备份软件清单

Homebrew 解决了“如何安装软件”,Brewfile 则进一步解决了“如何在另一台 Mac 上装回同一批软件”。

一个简单的 Brewfile 可能是这样:

1
2
3
brew "wget"
brew "redis"
cask "visual-studio-code"

在包含这个文件的目录中执行下面的命令,Homebrew 就会安装其中缺少的软件,并按默认行为升级已经过期的项目:

1
brew bundle

如果只想补齐缺少的软件,不希望同时升级已有项目,可以使用 brew bundle --no-upgrade

如果当前 Mac 已经配置好了开发环境,可以生成一份软件清单:

1
brew bundle dump --file="$HOME/Brewfile" --force

换到新 Mac 后,安装 Homebrew,再恢复这份清单:

1
brew bundle --file="$HOME/Brewfile"

建议把 Brewfile 放进个人配置仓库进行版本管理。这样记录下来的不再是一篇“新电脑要安装什么”的备忘录,而是一份可以重复执行的环境配置。

网络不畅怎么办

在国内网络环境下,Homebrew 偶尔会遇到下载缓慢或超时。排查时不要把所有问题都归结为“Homebrew 连不上”,因为一次安装可能会访问不同的地址:

  • 安装脚本通常来自 raw.githubusercontent.com
  • Formula 和 Cask 的元数据通常来自 Homebrew API;
  • Bottle 通常从容器镜像服务下载;
  • Cask 安装包还可能来自软件自己的官网。

先观察报错中的域名,可以更快判断究竟是哪一步失败。如果只是临时网络问题,可以重试,或者在当前终端设置本地代理:

1
2
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890

端口需要根据自己的代理工具调整。使用结束后可以取消:

1
unset HTTP_PROXY HTTPS_PROXY

如果长期使用镜像,Homebrew 提供了 HOMEBREW_API_DOMAINHOMEBREW_BOTTLE_DOMAIN 等环境变量,用来指定 API 和 Bottle 的镜像地址。具体值应以镜像提供方的最新说明为准,不建议从多年前的文章中直接复制一整套 git remote set-url 命令。

原因是 Homebrew 获取软件信息和安装包的方式会随版本变化。镜像地址也可能停止维护,长期保留失效配置反而会让正常网络下的安装失败。修改前应记录原配置,出现异常时及时撤销,并回到官方地址验证。

使用时要注意什么

不要随意使用 sudo

Homebrew 的安装程序可能在初始化目录时请求管理员权限,但安装完成后,日常的 brew installbrew upgradebrew uninstall 不需要加 sudo

随意执行 sudo brew ... 可能产生属于 root 用户的文件,之后普通用户更新和卸载时就会遇到权限问题。除非清楚某条命令的系统级效果,否则不要使用 sudo。

不要把 upgrade 当成无风险操作

brew upgrade 会升级所有过期的软件及相关依赖。数据库、运行时或基础库跨版本升级后,可能与现有项目不兼容。

更稳妥的做法是先执行 brew outdated,再使用 brew upgrade <formula> 按需升级。重要项目还应通过版本管理工具、容器或项目自己的锁文件固定运行环境,而不是完全依赖 Homebrew 中的最新版本。

谨慎使用第三方 Tap

Tap 中的 Formula、Cask 和扩展命令并不只是静态下载地址,Homebrew 在处理它们时可能执行其中的 Ruby 代码。因此,添加第三方 Tap 前要确认仓库的维护者、来源和更新情况。

当前版本的 Homebrew 会区分官方 Tap 和需要明确授权的第三方内容。对于偶尔使用的软件,优先安装完整名称指向的具体项目,不要为了一个软件轻易信任整个仓库。

分清系统工具和项目依赖

Homebrew 适合安装 Git、Node.js、Python、Redis 等系统级工具,但不应替代项目自己的依赖管理方式。

例如,JavaScript 项目的依赖仍然应该记录在 package.json 和锁文件中;Python 项目应使用虚拟环境和对应的依赖文件。否则不同项目的依赖混在全局环境中,很容易出现“在我的电脑上可以运行”的问题。

不要直接修改 Homebrew 的目录

遇到链接或权限问题时,不要直接删除 /opt/homebrew/usr/local 或 Cellar 中的文件,也不要根据不明来源的命令批量修改目录权限。

先通过下面的命令确认架构和真实路径:

1
2
3
arch
command -v brew
brew --prefix

Apple Silicon Mac 如果从旧的 Intel Mac 迁移过数据,还可能同时存在 /usr/local/opt/homebrew 两套 Homebrew。此时应先导出软件清单、确认当前终端使用的架构,再按照官方迁移建议处理,避免误删仍在使用的环境。

谨慎使用 cask 的 zap 参数

普通的 Cask 卸载以删除应用为主。如果需要进一步清理相关配置,可以使用:

1
brew uninstall --cask --zap <软件名>

--zap 可能删除应用之外的配置文件,甚至影响多个应用共享的文件。执行前应先确认这些数据是否还需要保留。

写在最后

Homebrew 最有价值的地方,不只是把一条很长的安装流程缩短成 brew install,而是给软件管理提供了一套一致的方式:先搜索和了解,再安装;需要时更新和卸载;最后用 Brewfile 把整个环境记录下来。

当换电脑或重装系统时,真正省时间的不是记住了多少条命令,而是能够把环境配置变成一份可以检查、修改和重复执行的清单。

本文涉及的命令会随 Homebrew 版本演进,安装和故障排查时应以官方资料为准: