☰
macOS 软件包管理工具 Homebrew 核心原理与实用指南
2026/10/6 9:01:02 网站建设 项目流程

你第一次在 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、openjdk@8这类开发环境常用的软件,用 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 wget
Cask安装图形应用brew install --cask iterm2
Tap添加额外软件源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 Tools

Homebrew 运行依赖 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 Silicon(M1/M2/M3 等)机器上,brew 安装在/opt/homebrew;Intel 机器上,安装在/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_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api" export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles" 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"

建议直接打开镜像站首页,复制最新的推荐配置,因为镜像站会跟着 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 upgrade

brew 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 list

brew 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 时都先跑一次 update:

export HOMEBREW_NO_AUTO_UPDATE=1

可以写进~/.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检查环境问题,这两条命令能帮你节省大量排查时间。工具的意义从来不是让你背熟命令,而是让你不再为“安装”这件事分心。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询