在 macOS 上折腾开发环境,你迟早会跟 Homebrew(也就是大家常说的 brew)打交道。但很多人第一次用 brew,都卡在同一个地方:安装慢、下载慢、更新慢,跑个brew install能把人急出白头发。尤其是热搜词里那些 “mac 安装 brew”“Intel 安装 brew” 的高频搜索,本质上都是同一个需求:怎么让 brew 在国内的网络环境下也能顺利跑起来。这篇不谈理论,直接把我折腾过、验证过的加速方案整理出来,从安装到换源、从配置到排错,照着抄就行。
先说清楚一个事实:brew 本身并不慢,慢的是它默认去访问的服务器。Homebrew 的代码仓库在 GitHub,预编译软件包(bottle)放在 ghcr.io,API 数据也在 GitHub 上。这些服务在国内网络环境下经常连不上或者极其缓慢,于是就有了“brew 安装慢”这个经典问题。解决方案也很明确:把 brew 的下载地址切换到国内可直连的镜像源。下面从原理到实操一步步来。
1. 为什么 brew 安装会慢到让人抓狂
1.1 慢在哪一步:先搞清楚瓶颈
很多人遇到 brew 慢,第一反应是“换个源”,但换了之后依然卡。原因很简单,没找到真正的瓶颈。brew 慢通常发生在三个环节,对应三个完全不同的网络请求地址:
- 安装脚本本身:官方安装脚本
install.sh存放在raw.githubusercontent.com上,这个域名在国内访问经常超时,卡住的第一站就是它。 - 仓库数据:Homebrew 及其核心仓库
homebrew-core、homebrew-cask存放在 GitHub,git clone和git fetch都需要访问 GitHub。 - 软件预编译包(bottle):安装软件时下载的二进制压缩包存放在
ghcr.io(GitHub Container Registry)。这个域名在国内的连通性更差,经常是下载到一半就断掉。
所以,一个完整的加速方案要覆盖这三个环节:安装脚本换源或手动安装、仓库地址换源、bottle 下载地址换源。只处理其中一个,另一个问题很快就会冒出来。
1.2 芯片不同,安装路径完全不同
在动手之前必须先确认你的 Mac 是 Intel 还是 Apple Silicon,因为 brew 的安装路径和后续操作路径完全不同。这个区分也对应了热搜词里的 “Intel 安装 brew” 和 “M 芯片安装 brew”。
Apple Silicon(M1、M2、M3、M4 等)的 brew 默认安装在/opt/homebrew,命令路径是/opt/homebrew/bin/brew。Intel Mac 的 brew 默认安装在/usr/local,软链接在/usr/local/bin/brew。如果你照着网上的教程复制粘贴,最典型的翻车事故就是把/opt/homebrew的命令原封不动用在 Intel 机器上,结果bash: /opt/homebrew/bin/brew: No such file or directory。
查看芯片型号最简单的方法是在终端执行:
uname -m输出arm64就是 Apple Silicon,输出x86_64就是 Intel。记住这个结果,后面所有命令都要据此区分。
2. 安装 brew 阶段如何加速
2.1 安装前的必备检查
安装 brew 之前,有几个前置条件需要确认,否则安装过程会中途失败。
首先,macOS 必须已经安装了 Command Line Tools(命令行工具)。brew 依赖 Git、curl 等基础工具。如果没装,执行brew --version会提示你先安装,比较省事的方式是执行:
xcode-select --install系统会弹出图形化安装界面,耐心等它装完即可。如果这个命令报错说软件源不可用,也可以直接从 Apple 开发者官网下载对应版本的 Command Line Tools 安装包手动安装。
其次,确认你的 Git 版本不要太老。可以在终端里看:
git --version如果 Git 版本过低,brew 装完后可能会报一些奇怪的错误,升级 Git 也很让人头疼。好在多数新 macOS 自带版本都够用。
2.2 使用国内镜像安装脚本,一次到位
官网推荐的安装命令是:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"这条命令在国内环境经常连raw.githubusercontent.com都访问不了,更不用说后面的仓库拉取了。我建议直接用国内镜像脚本。
以中科大镜像为例,它的安装脚本会自动设置好环境变量,再调用官方安装流程。Intel 和 Apple Silicon 都能用:
/bin/bash -c "$(curl -fsSL https://mirrors.ustc.edu.cn/misc/brew-install.sh)"这个脚本执行后,会自动把 brew 相关的远程仓库地址指向中科大镜像,整个过程显著提速。实测下来,原来可能卡死 10 分钟以上的安装脚本,换成镜像后一般在 1 到 2 分钟内就能完成。
阿里云镜像也提供了类似的安装引导,路径是:
/bin/bash -c "$(curl -fsSL https://mirrors.aliyun.com/homebrew/install.sh)"清华大学的镜像则推荐你先设置环境变量,再执行官方脚本:
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git" export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles" export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api" /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"之所以推荐中科大镜像脚本,是因为它把环境变量设置都封装进去了,对新手最友好。但要注意:脚本执行完后会提示你把环境变量写到 shell 配置文件里,这一步千万别跳过。
2.3 手动 git clone 安装(备选方案)
如果自动安装脚本因为各种奇怪原因失败,还有一个备选方案:手动从镜像仓库 clone 整个 brew 仓库。
Apple Silicon 机器执行:
sudo mkdir -p /opt/homebrew sudo chown -R "$USER":admin /opt/homebrew git clone --depth=1 https://mirrors.ustc.edu.cn/brew.git /opt/homebrewIntel 机器执行:
sudo mkdir -p /usr/local/Homebrew sudo chown -R "$USER":admin /usr/local/Homebrew git clone --depth=1 https://mirrors.ustc.edu.cn/brew.git /usr/local/Homebrew然后手动创建命令入口。Apple Silicon 执行:
sudo ln -s /opt/homebrew/bin/brew /usr/local/bin/brew其实 Apple Silicon 机器不需要把 brew 软链到/usr/local/bin,因为/opt/homebrew/bin加进 PATH 就可以直接用了。在~/.zshrc里加入:
export PATH="/opt/homebrew/bin:$PATH"Intel 机器如果git clone出来的目录里有bin/brew,可以用软链接方式把命令暴露出来:
sudo ln -s /usr/local/Homebrew/bin/brew /usr/local/bin/brew手动 clone 的坏处是没有安装脚本里那些辅助逻辑,后续 core、cask 仓库都要自己配置,所以只建议作为自动脚本失败时的兜底方案。
3. 安装完成后的换源加速
3.1 4.0 新机制:API 源比 core 源更关键
Homebrew 在 4.0 版本之后做了个重要改动:默认不再通过git clone整个homebrew-core仓库来获取软件信息,而是通过 JSON API 按需拉取。这意味着HOMEBREW_CORE_GIT_REMOTE的作用在变小,真正影响速度的是HOMEBREW_API_DOMAIN。
很多老教程还在让你只配 core 仓库,配完发现 brew install 依然慢,就是因为 API 拉取的地址还是官方的https://formulae.brew.sh/api。虽然这个地址相对稳定,但在国内也有明显延迟。正确的做法是把 API 域名一起换成镜像源。
所以下面给出的环境变量里,HOMEBREW_API_DOMAIN和HOMEBREW_BOTTLE_DOMAIN是最关键的两个,HOMEBREW_BREW_GIT_REMOTE负责 brew 自身的更新,也不可或缺。
3.2 环境变量换源法(中科大/清华/阿里/腾讯)
最推荐、也最干净的做法是直接设置 shell 环境变量。把下面任一方案追加到你的 shell 配置文件。macOS Catalina 之后默认 shell 是 zsh,配置文件是~/.zshrc;如果你还在用 bash,就写进~/.bash_profile。
中科大源:
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git" export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git" export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles" export HOMEBREW_API_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/api"清华源:
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git" export HOMEBREW_CASK_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git" export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles" export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"阿里云源:
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.aliyun.com/homebrew/brew.git" export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.aliyun.com/homebrew/homebrew-core.git" export HOMEBREW_CASK_GIT_REMOTE="https://mirrors.aliyun.com/homebrew/homebrew-cask.git" export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.aliyun.com/homebrew/homebrew-bottles" export HOMEBREW_API_DOMAIN="https://mirrors.aliyun.com/homebrew/homebrew-bottles/api"腾讯云源:
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.cloud.tencent.com/homebrew/brew.git" export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.cloud.tencent.com/homebrew/homebrew-core.git" export HOMEBREW_CASK_GIT_REMOTE="https://mirrors.cloud.tencent.com/homebrew/homebrew-cask.git" export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.cloud.tencent.com/homebrew/homebrew-bottles" export HOMEBREW_API_DOMAIN="https://mirrors.cloud.tencent.com/homebrew/homebrew-bottles/api"设置完执行source ~/.zshrc让配置立即生效。然后跑一句:
brew update --force强制让 brew 从新源重新拉取数据。执行过程里注意观察输出,看看仓库地址是否已经变成镜像域名。
3.3 顺手优化的两个环境变量
除了换源,还有两个环境变量值得顺手加上,能大幅改善日常使用体验。
第一个是HOMEBREW_NO_AUTO_UPDATE=1。brew 在每次执行安装命令前都会尝试自动更新自己,这个行为在国内网络下经常导致命令卡住好几分钟。关闭自动更新后,brew install的响应速度会明显提升,需要更新时手动执行brew update即可。
第二个是HOMEBREW_NO_INSTALL_CLEANUP=1。旧版本 brew 每次安装完会做清理,新版本默认策略已经变了,但如果你的版本还在自动清理,也可以显式关掉。顺手加这两个变量:
export HOMEBREW_NO_AUTO_UPDATE=1 export HOMEBREW_NO_INSTALL_CLEANUP=1此外,HOMEBREW_NO_ANALYTICS=1可以关闭匿名统计上报,既省一点流量,也减少一次网络请求:
export HOMEBREW_NO_ANALYTICS=1都写完后的~/.zshrc大概是这个样子:
export PATH="/opt/homebrew/bin:$PATH" export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git" export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git" export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles" export HOMEBREW_API_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/api" export HOMEBREW_NO_AUTO_UPDATE=1 export HOMEBREW_NO_INSTALL_CLEANUP=1 export HOMEBREW_NO_ANALYTICS=14. 安装软件时的其他提速技巧
4.1 bottle 下载加速
换源后,brew install下载的软件包走的是HOMEBREW_BOTTLE_DOMAIN指向的镜像。这一步是安装软件时的最大流量来源,也最容易出问题。
可以验证一下某个软件的下载地址是否已经变成镜像:
brew info wget输出信息里会标明From: https://mirrors.ustc.edu.cn/homebrew-bottles/...之类的地址,说明 bottle 源生效了。如果显示的还是ghcr.io开头的地址,说明环境变量没生效,检查~/.zshrc是否加载、新终端是否重开。
4.2 强制用预编译包避免源码编译
brew 理论上偏爱预编译的 bottle,但在某些情况下会尝试从源码编译。比如你指定了--build-from-source,或者该软件没有提供适配你系统的 bottle。源码编译的时间往往非常长,动辄十几分钟,对网络要求其实不高,但对耐心要求极高。
正常情况下如果本地已经有 bottle,可以直接强制使用:
brew install --force-bottle wget这条命令会强制使用预编译包,不进行源码编译。如果你的机器是 Intel Mac,而某个软件官方已经停止提供 Intel 版 bottle,那无论网速多快都只能源码编译,这种情况只能等,或者换一个功能相近的软件。
4.3 用 brew -v 定位卡点,告别白等
很多人遇到brew install卡住就急得跺脚,其实可以先看它到底卡在哪一步。常用调试方式是:
brew install -v wget-v参数会输出详细的下载日志,包括正在请求的 URL、当前下载进度。如果卡在下载 URL 上,说明源有问题;如果卡在处理依赖上,可能是依赖没装好;如果卡在编译上,说明在编译源码。看清卡点再对症下药,比盲目重试高效得多。
5. 实操记录:从零到装完 wget 的全过程
5.1 现场实录
拿一台空的 Intel Mac 举例,完整跑一遍加速流程。终端先看架构:
uname -m输出x86_64。安装命令行工具:
xcode-select --install弹窗后确认安装,等它完成。然后执行中科大安装脚本:
/bin/bash -c "$(curl -fsSL https://mirrors.ustc.edu.cn/misc/brew-install.sh)"脚本跑完会在终端末尾提示添加环境变量。按提示把下面内容写入~/.zshrc:
export PATH="/usr/local/bin:$PATH" export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git" export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git" export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles" export HOMEBREW_API_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/api" export HOMEBREW_NO_AUTO_UPDATE=1注意 Intel 机器上 Homebrew 会提示你加/usr/local/bin到 PATH。执行:
source ~/.zshrc然后看一眼版本:
brew --version能正常输出版本号,说明核心安装成功。接着装一个最常用的 wget:
brew install wget全程盯着输出,下载阶段可以看到从mirrors.ustc.edu.cn拉取 bottle 的信息。整个安装过程在一两分钟内结束,对比之前动不动就卡死的体验,差异非常明显。
Apple Silicon 机器上的流程几乎一样,只是脚本执行完后 PATH 要写/opt/homebrew/bin,仓库目录也是/opt/homebrew,其余命令相同。
5.2 如何验证源已经生效
安装完之后,可以用几个命令确认所有源确实都切到了镜像:
brew doctor brew configbrew config的输出里会列出当前生效的各种地址变量。重点看这几行:
HOMEBREW_BREW_GIT_REMOTE:应该指向镜像仓库。HOMEBREW_BOTTLE_DOMAIN:应该指向镜像的 bottles 地址。HOMEBREW_API_DOMAIN:应该指向镜像的 API 地址。
如果哪一项显示为官方 GitHub 地址,说明对应的环境变量没写对或没重新加载配置,回到~/.zshrc检查。
brew doctor如果输出Your system is ready to brew,恭喜你,brew 已经处于健康可用的状态。
6. 典型问题排查与避坑指南
6.1 常见错误对照表
我把实际踩过、以及在群里看到别人踩过的高频问题整理成一张表,方便快速对照:
| 症状 | 可能原因 | 处理方法 |
|---|---|---|
安装脚本提示curl: (7) Failed to connect to raw.githubusercontent.com | 安装脚本源被卡住 | 改用中科大brew-install.sh脚本 |
brew install卡在Updating Homebrew... | 自动更新导致 | HOMEBREW_NO_AUTO_UPDATE=1或手动brew update |
| 下载软件时进度条长时间不动 | bottle 源还是官方地址 | 检查HOMEBREW_BOTTLE_DOMAIN是否生效 |
Error: No such file or directory @ rb_sysopen | 安装路径不对 | 重新确认芯片架构,路径写成/opt/homebrew还是/usr/local |
Permission denied或cannot overwrite directory | 目录权限不对 | 用sudo chown -R "$USER":admin修复 Homebrew 目录权限 |
command not found: brew | PATH 没配置好 | 把对应路径写入~/.zshrc并source |
6.2 换源后想还原官方源怎么办
不想一直用镜像源,或者某个镜像临时抽风想切回官方,不用重装 brew。只要把~/.zshrc里的相关环境变量删掉,再恢复仓库的远端地址就行。
先解除环境变量干扰,重新打开终端会自动失效,或者手动执行:
unset HOMEBREW_BREW_GIT_REMOTE unset HOMEBREW_CORE_GIT_REMOTE unset HOMEBREW_BOTTLE_DOMAIN unset HOMEBREW_API_DOMAIN然后进入 brew 安装目录,把 git remote 改回 GitHub:
cd "$(brew --prefix)" git remote set-url origin https://github.com/Homebrew/brew.git最后执行brew update重新拉取。完整切换回官方源的过程,网上也有很多一键脚本可以偷懒,但不建议直接跑不明来源的脚本,手动改清楚自己心里有数。
6.3 几个我踩过的坑
第一个坑是修改了/usr/local的全局权限。早期教程喜欢让人sudo chown -R $(whoami) /usr/local,把整个目录都改成当前用户所有。这样短期内确实解决了权限报错,但会让 macOS 的系统目录权限变得一团糟,后续升级系统或运行其他软件都可能出问题。正确做法是只对 Homebrew 自己的目录做权限修改,/usr/local里的其他东西别乱动。
第二个坑是忽略了 API 域名。很多人看教程只设置了 brew 和 core 两个仓库地址,装那些不需要源码编译的软件还好,可一旦某个软件需要走 API 拉取信息就会明显变慢。我自己有段时间brew search一直卡顿,后来才发现是 API 域名没换。4.0 之后的版本里,HOMEBREW_API_DOMAIN的价值甚至超过 core 仓库。
第三个坑是把自动更新完全关掉之后长时间不更新。HOMEBREW_NO_AUTO_UPDATE=1确实让日常安装快了很多,但 brew 的软件定义是持续更新的,几个月不更新后,各种依赖关系会变得很陈旧,再执行brew update时反而会因为跨度太大拉取大量数据。建议至少每个月手动执行一次brew update,让容器保持新鲜。
第四个坑是忽略 cask 仓库的配置。如果你经常用brew install --cask安装图形化软件,比如浏览器、编辑器这类,那么HOMEBREW_CASK_GIT_REMOTE也很重要。虽然新版 API 模式让 cask 信息也走接口,但某些老版本或特定场景下还是会直接拉取 cask 仓库,提前配置好能少踩一个坑。
最后一个建议:用完某个镜像源发现速度不理想,就换一个。中科大、清华、阿里云这几个源在不同时间段、不同网络环境下的表现会有差异,没有绝对的最优解。切换源的成本很低,改几行环境变量再执行brew update --force就行,多试几个,找到你自己网络环境下最稳的那个。我个人的习惯是中科大做主力、清华做备用,一条命令就能切换。
另外,如果你身边有朋友装了老版本 brew,建议顺手提醒他执行一次brew update升级到新版本。旧版本和新版本在源配置上差异不小,老教程里的一些方法在新版本里未必适用,避免大家一起踩坑。