
你第一次在 macOS 的终端里敲下brew install的时候大概率只是照着教程一路复制粘贴。可一旦你经历过 App Store 搜不到 redis、官网下载 dmg 反复拖拽进 Applications、手动编译 ffmpeg 编译到怀疑人生你就会明白Homebrew 作为 macOS 上最有名的软件包管理工具解决的从来不只是“把软件装进去”这一件事。这篇文章围绕 Homebrew 的作用、运行原理、安装卸载、基本命令和常见故障展开不管你是刚接触 macOS 的小白还是已经装了 brew 但只会用 install 命令的开发者都能找到可以直接照做的内容。1. Homebrew到底解决了什么问题很多人第一次听说 Homebrew是在某个安装教程里看到的“先装 brew再 brew install xxx”。这句话背后其实藏着一个很现实的问题macOS 本身没有一个好的命令行软件分发渠道。1.1 App Store 装不了的那些软件App Store 的设计初衷是面向普通用户上架的多是图形化应用对命令行工具、开发库、开源软件基本是绝缘的。你没法在 App Store 里搜索nginx也没法一键安装ffmpeg更别说那些需要跟着系统版本频繁更新的编译工具链。所以 macOS 用户长期以来的状态是要用什么去哪找最常见的方式是去官网下载源码包自己编译或者去 GitHub 找 release 版本手动配置 PATH。这个过程偶尔做一次还行一旦你的电脑上要装十几种工具每个工具又依赖其他库手动维护就会迅速失控。Homebrew 就是在这个背景下诞生的它把散落在各处的开源软件统一收拢到一套命令体系里只要brew install剩下的下载、解压、依赖安装、路径配置全部自动完成。1.2 手动编译与依赖处理的痛我印象最深的一次经历是早年在一台旧 Mac 上手动编译 ffmpeg。那时候不知道有 brew于是按网上的教程先装 yasm、pkg-config再处理 libx264、libmp3lame、libvpx 等一长串依赖。中途遇到缺库、版本不匹配、编译器报错前前后后折腾了好几个小时最后编译出来的 ffmpeg 还自带一堆兼容问题。用 Homebrew 之后一条命令搞定brew install ffmpeg。它会自动检查依赖链把需要的库全部装好并根据当前 macOS 版本选择预编译的 bottle预编译包不需要你亲自编译源码。这就是软件包管理工具的核心价值管理依赖树保证各个组件之间版本协调而不是让你面对一堆二进制文件自己拼图。不只是 ffmpeg像mysql、redis、nginx、openjdk8这类开发环境常用的软件用 brew 安装都能省下大量时间。你也不用担心卸载不干净因为 brew 会把所有相关文件放进自己的目录卸载时统一处理。1.3 Homebrew的能力边界搞清楚 Homebrew 能做什么、不能做什么比记住一堆命令更重要。它能做的按类型分有三块命令行工具官方叫 Formula比如wget、git、ffmpeg、图形化应用官方叫 Cask比如 Chrome、VS Code、Typora、后台服务通过brew services管理比如启动一个常驻的 MySQL 服务。它不能做的事也不少不能帮你处理系统级设置比如修复“废纸篓文件删不掉”“钥匙串找不到”这类问题那些需要单独排查不能保证每个软件都能装个别只在官网发布且没有提供归档包的软件brew 也无能为力也不能替代软件本身的授权流程比如你通过 cask 安装了某个收费软件仍然需要自行处理激活或订阅。理解这层边界之后你就知道什么时候该找 brew什么时候该绕开它。接下来再往深一层看 brew 的工作方式。2. 理解brew的核心概念命令才有意义装好 brew 之后很多人第一件事是搜“brew 命令大全”然后背公式。我建议你先花十分钟理解三个概念Formula、Cask、Tap以及它背后的目录结构。搞懂这些再看命令会非常顺。2.1 Formula、Cask、Tap到底是什么Formula 是 brew 里描述命令行工具的“安装配方”里面写明了软件从哪下载、依赖哪些库、安装后如何处理可执行文件。比如brew install wget就会用到 wget 的 formula。绝大多数常见命令行工具都收录在官方仓库homebrew/core中。Cask 是专门用来安装 macOS 图形应用的扩展机制。它的使用方式多了一个--cask参数比如brew install --cask iterm2、brew install --cask google-chrome。之所以要和 Formula 分开是因为图形应用的打包方式、安装位置和命令行工具完全不同拆开管理更清晰。Tap 则像是“第三方软件源”。官方没有收录的软件可以通过 Tap 引入外部仓库。比如brew tap caskroom/cask这种写法曾经很常见现在虽然大多数软件已经进了默认仓库但有时安装一些小众工具仍然需要先 tap。用表格总结一下关系概念作用常用命令示例Formula安装命令行工具brew install wgetCask安装图形应用brew install --cask iterm2Tap添加额外软件源brew tap some/repo记住一条判断原则命令行工具直接用brew install图形应用加--cask仓库里没有就先brew tap这三个动作覆盖了绝大多数安装场景。2.2 Cellar、软链接与路径的秘密Homebrew 有个和其他包管理器不一样的设计它会把安装的软件统一放在一个专门目录里而不是散落到系统各处。这个目录叫 Cellar在 Apple Silicon 机器上是/opt/homebrew/Cellar在 Intel 机器上是/usr/local/Cellar。装好的软件会按“目录名/版本号”分门别类存放。为了让系统能找到这些命令brew 会在/opt/homebrew/bin或/usr/local/bin下创建软链接指向 Cellar 里的实际可执行文件。这就是为什么你安装完 brew 之后系统要求你把/opt/homebrew/bin加入 PATH。这种设计的直接好处是卸载软件时只要移除 Cellar 里的对应目录和软链接就能做到比较干净。它不太会像某些 Windows 软件那样删了主程序还在注册表里留一堆垃圾。坏处也有就是 Apple Silicon 和 Intel 的目录路径不同你在网上看教程时要先分清楚自己的机器属于哪一类否则容易把路径抄错。2.3 依赖是怎么被自动处理的依赖管理是 brew 最核心的能力之一。它把每个 Formula 的依赖关系都记录清楚安装时自动解析出一棵“依赖树”然后把树上的所有节点依次装好。打个比方你想安装ffmpeg它依赖libass、libvpx、x264等一堆库而这些库本身又可能依赖其他更基础的库。手动处理这种多级依赖非常痛苦brew 则会在安装前先分析依赖关系缺哪个补哪个。这也是为什么有时候你执行brew install 某个软件它会先装一长串其他包——这不是它“自作主张”而是依赖链本来就需要这些组件。要看一个包依赖了哪些东西可以用brew deps 包名查看想看反方向也就是哪些包依赖某个包可以用brew uses 包名。这两个查询命令平时用得不算多但排查问题、清理无用依赖时非常有用。3. 安装与卸载的完整流程接下来进入实操环节。Homebrew 的安装过程看似只有一行命令但里面有不少细节值得提前确认特别是“安装失败”和“安装完发现 PATH 没配上”是新手最容易卡住的两关。3.1 装机前的检查Command Line ToolsHomebrew 运行依赖 Xcode Command Line Tools命令行开发者工具它提供了编译工具、Git 等基础组件。安装 brew 之前先检查一下这个工具是否已经存在xcode-select -p如果输出类似/Library/Developer/CommandLineTools说明已经安装了如果报错就需要手动安装xcode-select --install执行后系统会弹出图形界面提示等待下载安装完成即可。注意这一步很耗时取决于网络状况有时候要等很久。不提前装好 Command Line Tools后面跑 brew 安装脚本大概率会报错所以别跳过这个检查。3.2 安装脚本与官方路径差异确认 Command Line Tools 之后在终端运行官方安装脚本/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)脚本会先解释将要安装的位置并且要求你输入密码。这里有个很多人没注意到的差异Apple SiliconM1/M2/M3 等机器上brew 安装在/opt/homebrewIntel 机器上安装在/usr/local。安装完脚本会提示echo eval $(/opt/homebrew/bin/brew shellenv) ~/.zprofile eval $(/opt/homebrew/bin/brew shellenv)这是让/opt/homebrew/bin进入当前用户的 PATH。Intel 机器一般不需要这一步因为/usr/local/bin通常已经在 PATH 里了。安装完成后运行brew --version确认版本号正常输出没有报错就说明基本成功了。3.3 速度问题和镜像源配置国内网络环境下brew 安装最常遇到的坑是卡在下载阶段。原因是 brew 的安装脚本和预编译包默认托管在境外服务器上某些网络条件下连接很慢或者直接中断表现为curl: (7) Failed to connect这种错误。此时不用反复重试正确做法是配置国内镜像源。不同镜像站的具体配置方法略有差别以清华镜像为例大致思路是把 brew 的 Git 仓库地址和 bottle 下载地址指向镜像站export HOMEBREW_API_DOMAINhttps://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api export HOMEBREW_BOTTLE_DOMAINhttps://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles export HOMEBREW_BREW_GIT_REMOTEhttps://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git export HOMEBREW_CORE_GIT_REMOTEhttps://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git建议直接打开镜像站首页复制最新的推荐配置因为镜像站会跟着 brew 版本调整变量。配置变量之后再重新运行安装脚本速度会明显改善。3.4 彻底卸载与残留清理卸载 Homebrew 也是一个高频需求。有人是装坏了想重来有人是觉得“不用了想清干净”。官方提供了一个卸载脚本/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)脚本会删除 brew 本体和大部分安装到 Cellar 的软件但有一些残留位置需要你手动检查。常见残留包括/opt/homebrew或/usr/local里遗留的配置文件和目录、~/Library/Caches/Homebrew下载缓存、~/.zprofile或~/.zshrc里添加的环境变量。另外如果用 brew services 注册过后台服务最好先逐个停掉再卸载避免留下开机自启动的残留进程。4. 高频命令速查与使用场景现在来说基本命令。这里我不打算罗列所有命令而是按实际使用场景整理让你知道什么情况下该敲哪条每条命令做了什么。4.1 搜索、查看与安装安装之前先确认包是否存在。最常用的命令brew search nginx搜索结果会告诉你匹配的 formula 和 cask。确定要装之后可以先用brew info查看软件信息包括版本、依赖、是否已有新版本brew info nginx安装命令本身没什么悬念brew install nginx brew install --cask iterm2这里要强调一个细节如果同一个软件既存在 formula 又存在 cask比如mysql和mysqlworkbench你要搞清楚自己想装的是命令行客户端还是图形工具。装错的话会发现命令不存在或软件不对路。4.2 更新、升级与清理Homebrew 的包更新流程分两步第一步更新 brew 自身的索引类似刷新软件源列表第二步升级实际软件包。brew update brew upgradebrew update会从远程仓库拉取最新的 formula 信息brew upgrade才会真正把已安装的软件升级到新版本。有些人对这两个命令区分不清以为 update 就是升级。如果只想升级某一个软件可以指定名称brew upgrade nginx日常维护还有两个命令很值得养成习惯。一个是brew cleanup用来清理旧版本的残余文件另一个是brew autoremove用来卸载那些“因为依赖被装进来、但现在没有软件再需要它们”的包。相当于把不再使用的依赖树分支剪掉。很多人的 Mac 磁盘空间被 brew 悄悄占掉好几个 GB就是因为从来不跑这两个命令。4.3 brew services管理系统服务除了安装工具brew 还能帮你管理常驻后台的服务。典型的场景是本地开发环境装好mysql或nginx后你希望它开机自启动、一直在后台运行而不是每次手动执行命令。brew services start mysql brew services stop mysql brew services restart nginx brew services listbrew services list可以查看当前注册了哪些服务以及它们的状态started、stopped、error 等。这个命令本质上是帮你在 macOS 的 launchd 里注册了对应的 plist相当于把“服务管理”从系统底层剥离出来统一用 brew 的语法操作。4.4 用brew bundle还原整套环境强烈建议每个用 brew 的人都了解brew bundle。它的作用是把你当前装的所有软件导出到一个叫Brewfile的文件里之后换新电脑时一条命令就能还原整套开发环境。brew bundle dump这条命令会在当前目录生成 Brewfile内容就是所有已安装的 formula 和 cask。还原时在新机器上执行brew bundle它会按照 Brewfile 逐项安装。这个功能很适合有备份/迁移习惯的人相当于把你的开发环境“配置化”了。搭配 dotfiles 仓库管理从旧电脑迁移到新电脑效率会高很多。5. 常见故障与排查实录使用 Homebrew 的过程中几乎每个人都会遇到几次安装失败或命令卡住。这一节整理几个典型问题都是我自己踩过坑后总结出来的排查路径。5.1 安装脚本中途失败的最常见原因安装脚本失败原因通常集中在三处Command Line Tools 未安装、网络无法连接到下载服务器、系统版本过旧。排查顺序建议是先确认xcode-select -p有输出再检查网络能否访问 brew 官网服务器如果明显很慢或者失败直接配置镜像源后重试最后确认系统版本是否还在支持范围内。如果以上都正常但还是失败可以把安装时的错误信息复制出来搜索通常能找到官方 issue 或社区讨论。这里要说一句不少教程让人安装失败就到处问但你只要学会看终端的报错输出问题就解决了一半。报错里的关键词比如curl: (7)表示连接失败Operation not permitted表示权限问题command not found则说明路径没配好对症下药比盲目重试有效得多。5.2 brew update卡死多半不是Git的锅brew update卡住不动是另一个高频问题。以前 brew 的 update 依赖本地 Git 仓库仓库历史一长update 耗时就非常可观。现在新版 brew 已经逐步转向 API 方式但很多人仍会遇到卡顿。如果你的 brew update 卡住先看是不是网络问题——境外 GitHub 连接慢是老话题解决办法仍然是换镜像源。另一招是关闭 brew 的自动更新避免每次执行 install 时都先跑一次 updateexport HOMEBREW_NO_AUTO_UPDATE1可以写进~/.zshrc让这个变量永久生效。这样你安装软件时会快很多需要更新时手动执行brew update和brew upgrade。5.3 权限不足的几种处理方式有时运行brew install会报权限错误比如Permission denied rb_file_s_symlink之类。原因通常是 Homebrew 目录的所有权不对。Apple Silicon 机器上修复办法是把目录所有权交给当前用户sudo chown -R $(whoami) /opt/homebrew需要提醒的是在 Intel 机器上不要盲目对整个/usr/local执行chown -R因为那个目录里可能还装着其他软件粗暴的权限修改会把它们一起搞坏。更稳妥的修复方式是只处理 brew 相关子目录或者干脆重装 brew。这一节要特别留个心不要用 sudo 运行 brew install。正常情况下 brew 不需要提权使用 sudo 反而会把某些文件的所有权变成 root导致后续操作不断报错。5.4 旧系统被官方“放弃”该怎么办关于“Homebrew 取消对 macOS 10.15 系统支持”这件事需要客观看待。近几年新版本的 brew 逐步提升对系统版本的要求旧系统上直接安装新版本可能会提示 unsupported 或者干脆失败。这并非 brew 在“耍脾气”而是它的很多依赖组件已经不再兼容老系统的底层库。如果你的 Mac 还停留在 10.15 或更早的系统有两条路一是查找历史版本安装对应老系统的 brew 版本但这类版本可能不再维护使用中会遇到已知问题二是评估升级系统。我个人不建议在旧系统上花太多时间强行适配 brew风险和工作量都不成比例。6. 几个让我效率提升的实战建议最后分享一些相对进阶的使用技巧不是晦涩的原理而是我在日常工作中确实觉得有用的操作习惯。6.1 这些图形软件用cask装最省事很多人以为 brew 只能装命令行工具其实常用 macOS 图形软件也都能用它装。比如iterm2、visual-studio-code、typora、dbeaver、sublime-text、charles、anaconda、google-chrome这些一键安装非常省心。brew install --cask iterm2 brew install --cask dbeaver-community甚至像鼠标滚动方向修复这类小工具或者怀旧街机模拟器只要仓库里收录了 cask也都能用 brew 统一管理。这样一来你不需要记住每个软件的官网和下载方式只要一条命令就完成安装将来要批量卸载也方便。6.2 没事别乱sudo brew我再强调一次日常使用 brew 时不要加sudo。brew 的目录刻意设计成对当前用户可写加了 sudo 反而会破坏文件权限结构导致后面大量权限报错。同样地用 brew 安装的 Python 环境里也不建议随意用sudo pip install因为你可能覆盖了 brew 维护的文件结构。如果真的遇到权限问题先想想是不是目录所有权出了问题用ls -l查看一下所有权归属再决定下一步。系统会告诉你“Permission denied”但它不会告诉你“权限为什么乱了”这个只能自己排查。6.3 定期清理是你对brew最好的尊重brew 用久了Cellar 目录会积累大量旧版本、缓存文件和不再需要的依赖。我自己的习惯是每月跑一次brew cleanup每次升级完一批软件后跑一次brew autoremove然后看一眼brew list确认没有遗忘的旧包。另外升级也别太频繁。不要每天一有新版就brew upgrade全部升级尤其是 mysql、redis 这类服务型软件跨大版本升级可能导致配置文件不兼容。更安全的做法是先brew info 包名看看版本变化再决定是否升级——小版本随手更大版本想清楚再更能少踩很多坑。最后分享一点个人体会。新电脑到手我做的第一件事永远是先装 Command Line Tools再装 Homebrew然后brew bundle一键还原所有软件。这套流程看起来简单但背后是“把环境交给工具管理、把注意力留给真正的问题”的思路。如果你在用的过程中遇到某个包就是装不上也别急着反复重装先brew config看一下整体配置再brew doctor检查环境问题这两条命令能帮你节省大量排查时间。工具的意义从来不是让你背熟命令而是让你不再为“安装”这件事分心。