☰
Mac用户为何都会装Homebrew?完整解析与踩坑指南
2026/10/21 6:08:08 网站建设 项目流程

在Mac圈子里混久了,你会发现一个有趣的现象:不管一个人刚开始用Mac的时候多轻量,只用自带的Safari、备忘录和预览,最后几乎都会在一个夜深人静的加完班之后,默默打开终端,输入一行长长的安装命令。装完之后长出一口气,仿佛完成了某种成年礼。这个“它”,大概率就是Homebrew。

Homebrew是macOS上最流行的包管理器,简单说就是给命令行装软件的商店。你不需要去官网找dmg、不需要拖拽图标、不需要手动配置环境变量,一条brew install命令就能把几百兆的工具连同依赖一起装好。这篇文章不打算给你安利什么“神器”,而是想从“为什么最后都会装它”这个角度,把一个Mac用户从疑问到真香、从入门到踩坑的完整过程讲清楚。不管你是刚摸到Mac的小白,还是用了好几年的老用户,这里的内容应该都值得你花十分钟看完。

1. Homebrew是什么,以及为什么你的Mac迟早会需要它

1.1 一次真实的“被逼”经历

我自己真正装Homebrew,完全不是出于主动探索,而是被一个项目逼的。某次需要在本机跑一个内部脚本,脚本依赖一个叫wget的下载工具——对,就是Linux上司空见惯的那个wget。结果发现Mac自带的curl能用,wget就是没有。去官网下载一个pkg安装包,装完还挺顺利,但没过多久就发现版本太老,而且卸载的时候留下了不少乱七八糟的目录。

后来请教了一位做运维的朋友,对方只回了一句话:“你去把Homebrew装上,以后所有这类事情都用它解决。”当时我还觉得他过于神化这个东西,但装完之后,我才意识到之前手动安装工具的方式有多原始。

1.2 给没听过的人一句话解释

你姑且可以把它理解成“终端的App Store”。但和App Store不一样的是:

  • App Store里都是图形界面应用,Homebrew里绝大多数是命令行工具、开发库、服务端软件。
  • App Store的应用更新要走苹果审核,Homebrew的更新依赖Git仓库和社区维护。
  • App Store安装的应用待在一个沙盒里,Homebrew的程序可以随意读写你的文件系统,所以它的自由度更高,责任也更大。

Homebrew分两种安装方式:一个叫formula,用来装命令行工具和库;另一个叫cask,用来装图形界面应用。比如brew install git是装git命令行,brew install --cask google-chrome是装Chrome浏览器。在今天的版本里,装cask甚至不需要加--cask,brew会自动识别。

1.3 它到底装到哪里去了

在Apple Silicon的Mac上,Homebrew默认装在/opt/homebrew下;在Intel架构的旧Mac上,默认装在/usr/local下。它不像很多安装包那样会把文件散落到/Library和~/Library各个角落,而是尽量把所有程序、依赖、配置都收敛在自己的目录里。

这是Mac用户最终离不开它的核心原因之一:它让软件安装变得可预期、可追踪、可卸载。你装在Homebrew里的东西,几乎都在那一个目录里待着,理论上想清理干净,删掉那个目录就行(当然实际还有缓存和服务注册,后面说)。

提示:如果你打开终端输入which brew没有结果,说明还没装;如果输入brew --prefix能输出路径,说明已经装好了。

2. 为什么偏偏是它:Mac自带的软件管理方式到底缺了什么

2.1 没有“非图形软件”的官方渠道

macOS系统自带的软件安装方式其实只有三类:App Store、dmg拖拽、pkg双击。前两种已经相对成熟,但有一个巨大的空白:命令行工具、语言运行时、数据库等非图形软件,官方几乎不提供任何合适的安装方式。

你可能会说:“我下载源码自己编译不行吗?”行,但你得先装Xcode工具链,遇到各种头文件缺失、依赖库版本不匹配的问题。你要装个PostgreSQL,如果手动编译,光是依赖的openssl、readline、zlib就够折腾一晚上。Homebrew把这些都封装成了一个个公式(formula),每个公式都有明确的依赖关系、编译脚本、安装路径,一条命令解决所有。

2.2 系统自带命令的老化问题

很多Mac用户第一次感受到“我不能忍了”,是从发现系统自带bash、Python等版本太老开始的。macOS自带的bash被锁定在3.2版本,因为后续版本使用的是GPLv3协议,苹果不想换上。但你在网上查不少教程都会用到新语法,bash 3.2就是跑不了。Homebrew里直接brew install bash就能装到最新bash,然后改一下系统shell指向即可。

同理,自带的Python可能是3.9或者更早,而项目需要3.12的特性。用Homebrew安装Python的一大好处是它不会被系统升级覆盖,版本切换也相对自由。

2.3 依赖管理:传统安装最头疼的部分

试想一个场景:你想装某个工具A,工具A依赖库B的某个版本,而之前你手动装的库C又恰好把B的一个兼容版本覆盖了,A就崩溃了。在Windows上这叫DLL地狱,在Mac上就是“你往/usr/local/lib里塞了太多东西,终于有一天崩了”。

Homebrew的解法是“前缀隔离”。它把所有依赖都装到自己的目录下,并且优先让编译器找到自己的库。当你在Homebrew环境里执行brew install ffmpeg时,它会自动把ffmpeg需要的几十个依赖库装到/opt/homebrew/lib,并用Homebrew版本的动态链接库,从而不会打扰系统目录里的文件。这不是绝对完美,但确实比手动安装干净得多。

2.4 卸载与依赖清理的差别

传统dmg安装只能把应用拖到“应用程序”,表面上看删了应用就等于卸载了,但它留下的偏好设置、缓存、命令行插件往往还在。万一装的是命令行工具,散落在/usr/local/bin下的可执行文件更是很难清干净。

Homebrew则提供了可追踪的卸载机制:brew uninstall 软件名可以把软件及注册信息移除,brew autoremove能顺带删除不再被依赖的旧包。这种“装得清楚、删得干净”的体验,一旦习惯了,就真的再也回不去了。

3. 从零开始:安装、换源与首轮体检

3.1 安装前提:先搞定Xcode Command Line Tools

Homebrew老版本需要完整的Xcode,现在只需要命令行工具。安装时会自动弹出窗口让你安装Command Line Tools,也可以手动跑:

xcode-select --install

这个工具包含git、clang、make等基础编译工具。如果你打算以后编译各种软件,这是必需品。就算你不开发,很多brew包安装时也会调用编译器,所以别跳过。

3.2 官方安装命令与网络问题的铺垫

官方网站给的安装命令是:

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

这个脚本会创建目录、下载Homebrew本体并设置环境。但在国内网络环境下,访问GitHub源往往很慢甚至连接失败。这不是本文要细聊的网络技术问题,而是实际存在的情况。因此建议在安装之前先做好换源准备,或者直接用国内镜像安装。

如果你还没装,可以先用中科大源来安装,将安装脚本中的仓库地址替换为镜像地址:

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" /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

3.3 装完之后的换源配置

如果你已经用官方源装好了,也可以直接改镜像源。因为我的用户群体里用中科大源和清华源比较多,下面以中科大为例。大致需要改四部分:

  • brew本体仓库
  • homebrew-core(命令行软件核心库)
  • homebrew-cask(图形应用库)
  • bottles(预编译二进制包下载地址)

在终端执行:

cd "$(brew --repo)" && git remote set-url origin https://mirrors.ustc.edu.cn/brew.git cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core" && git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git cd "$(brew --repo)/Library/Taps/homebrew/homebrew-cask" && git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git

还要设置环境变量,把预编译包也指到镜像。打开~/.zshrc(如果你用zsh),添加:

export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles" export HOMEBREW_NO_AUTO_UPDATE=1

HOMEBREW_NO_AUTO_UPDATE=1这个作用先记住,后面踩坑要讲。然后让配置生效:

source ~/.zshrc

完成之后运行brew doctor和brew config。brew doctor会检查当前环境有没有冲突,比如提示你哪些目录权限不对、哪些环境变量异常;brew config会列出当前使用的源地址、版本、CPU架构等。第一次跑brew doctor如果有warning,别恐慌,它只是黄牌提醒,仔细看看解决掉关键项就行。

3.4 首轮体检:验证是否装到位

装完先做几个小测试:

brew --version brew list brew install wget && wget --version

能正常输出版本号,说明Homebrew已经在工作了。这时候你基本就正式踏入了“Mac高级用户”的门槛。

4. 日常使用的核心姿势:搜索、安装、更新、维护

4.1 搜索与查看信息:别靠猜

不确定软件叫什么名字,先搜:

brew search redis

这会把你需要的redis、redis-plus等所有带redis的formula和cask列出来。查询某个包的环境信息和依赖:

brew info redis

输出里包含版本、稳定版下载地址、依赖了哪些库、有哪些高危注意事项等。我个人的习惯,装任何稍微复杂的软件前都会先看一眼brew info,心里有底再下手。

4.2 安装formula与cask的边界

命令行工具直接:

brew install jq

图形应用:

brew install --cask visual-studio-code

注意现在新版brew也允许你直接brew install visual-studio-code,它会自动判断是不是cask。但为了明确意图,建议还是按类型加参数,避免某些名称同时存在formula和cask时产生歧义。

装完cask应用后,默认会放在“应用程序”目录里,可以直接用Spotlight搜到。如果你想改变cask安装的位置,可以通过环境变量设置,但我强烈不建议新手乱改。因为很多cask脚本假设你装在标准位置,乱改容易导致应用无法启动。

4.3 更新升级不要乱按像素照搬

我见过不少新手把brew update和brew upgrade混为一谈。简单说:

  • brew update是更新Homebrew自己以及各个tap的仓库索引,相当于更新“软件商店的清单”。
  • brew upgrade是根据这个新清单,把你本机已安装的软件升级到最新版本。

日常维护步骤最好按顺序执行:

brew update brew upgrade brew cleanup

brew cleanup会清理旧版本软件留下的残留文件和缓存,腾出磁盘空间。你可以先brew cleanup -n看有哪些东西会被清理,确认无误后再真正执行。

重要技巧:如果你只想升级某一个包,千万别一整串brew upgrade,那会让你所有软件都升级,可能出现版本兼容问题。用brew upgrade 包名定点升级即可。

4.4 服务的启动与停止:一条命令搞定后台进程

在Linux上你可能习惯用systemctl管理MySQL、Redis这类后台服务。Mac上Homebrew也提供了类似能力:

brew services list brew services start redis brew services stop redis brew services restart nginx

这个命令的本质是把软件注册成一个后台启动项(LaunchDaemon),让你不用每次手动去敲redis-server。尤其是你装了MySQL、PostgreSQL、Nginx后,用brew services管理会省心很多。

一个细节:brew services start默认是开机自动启动。如果你只是想在当前会话跑一次服务,不想要开机自启,可以改用brew services run,它只在当前登录期间生效。

4.5 查看装了什么、哪些没被依赖

时间一长,你会忘记自己装过什么。用:

brew list # 列出自安装的formula brew list --cask # 列出图形应用 brew leaves # 列出没有被其他包依赖的formula,即“顶层包” brew deps --tree --installed # 以树状图展示依赖关系

brew leaves特别有用。当你觉得装的东西太多、想减负时,这个列表才是你真正需要审视的。依赖它的包会跟着卸载吗?不会,得brew autoremove才能清掉不再被需要的依赖。

4.6 高级:创建自己的tap,把私有脚本也纳入管理

如果你有自己写的脚本或工具,想在多台Mac之间复用,可以把它们做成一个自己的tap。简单做法是创建一个Git仓库,里面维护若干Formula/*.rb文件,然后:

brew tap 用户名/仓库名 brew install 用户名/仓库名/工具名

这样就不需要手动把脚本复制到/usr/local/bin了。对你来说,这也算进入了“自制软件包维护者”的世界。我自己在团队里就是这么分发内部CLI工具的,比微信传压缩包体验好太多。

5. 踩坑笔记:依赖冲突、权限、缓存与卸载残留

5.1 坑一:把/usr/local目录的权限改坏了

在旧版Homebrew时代,安装时会提示你修复/usr/local的权限,因为普通用户没有写权限。当时网上很多教程直接让你:

sudo chown -R $(whoami) /usr/local

这种做法确实能解决问题,但也留下了隐患。如果你不小心对/usr/local递归执行了错误的权限修改,可能会把很多系统级文件都归到当前用户名下,之后其它软件运行会莫名其妙失败。Apple Silicon架构下,Homebrew装在/opt/homebrew,这个目录本身属于当前用户,所以遇到权限问题的概率小很多。但如果你用的是Intel Mac或通过Rosetta兼容的方式使用,仍然要小心。

正确做法是:不要轻易对整个目录做chown,如果你需要修复某个brew包的权限,让它自己重装,比如brew reinstall 包名。真的遇到/opt/homebrew目录权限不对,可以先brew doctor,它通常会给出现成的修复命令。

5.2 坑二:多个版本的语言运行时并存

装Python时你会看到python@3.9、python@3.11等不同版本。Homebrew允许你同时装多个版本,然后用brew link把其中一个设置为默认。但如果你先后安装了两个,并且产生冲突,链接会失败。

我遇到过的情况是:python@3.9被某个项目依赖,我又手动装了python@3.11,导致python3命令指向了不明确的版本。解决方法是,查看当前被链接的版本:

brew list python@3.11 --versions brew unlink python@3.9 brew link --overwrite python@3.11

注意,使用--overwrite前最好想清楚代价。它可能会覆盖系统里某些同名文件。更稳妥的办法是,不要使用系统级的python3,而是借助虚拟环境管理工具(如pyenv或conda),但这就走了另一条路,这里不多展开。

5.3 坑三:更新时卡在“Updating Homebrew...”

很多人初次运行brew install时,会看到终端在“Updating Homebrew...”上停留很久。这是因为Homebrew每次执行命令前都想去更新仓库索引,但网络慢或镜像更新延迟,就显得非常卡。

两种解法:

  • 设置HOMEBREW_NO_AUTO_UPDATE=1,跳过自动更新。前面换源时我加了这个,就是为了一次次等更新太烦。
  • 需要更新时,手动执行brew update即可,这样就能把控制权抓在自己手里。

这个环境变量强烈建议设为默认。因为自动更新本意是好的,但在网络状况不理想时,它会让你连最基本的brew install都变成漫长的等待。

5.4 坑四:cask应用更新的权限弹窗

如果你用brew upgrade --cask更新图形应用,有时会遇到“安装失败”或“身份验证”弹窗。这是因为新版macOS对应用的安装权限管控更严,尤其是把应用移动到“应用程序”目录时,需要管理员权限。

遇到这种情况,不要慌,重新单独执行:

sudo brew upgrade --cask 应用名

没错,cask命令偶尔也需要sudo,因为它要写系统的“应用程序”目录。但需要注意,一旦该cask不是以默认路径安装的,sudo可能会把应用装到另一个位置。所以如果你自定义了安装路径,最好先把路径改回默认,再sudo升级。

5.5 坑五:卸载不彻底,残留缓存和服务

brew uninstall只删除软件本体和链接,但不会自动删除它的依赖缓存、日志文件。一个已经卸载的软件,它的缓存可能在~/Library/Caches/Homebrew下。建议定期:

brew cleanup --prune=all

这会把所有旧版本的缓存清理掉。针对某些服务型软件,如果之前用过brew services start,就算你卸载了软件,启动项也可能还在。你需要:

brew services stop 服务名 brew services cleanup

brew services cleanup会将所有已卸载应用的service文件一并清理。

5.6 坑六:换了系统版本后Homebrew不能用了

macOS系统大版本升级(比如从Ventura升到Sonoma)之后,/usr/local或/opt/homebrew里的某些二进制可能因权限、签名机制变化而无法运行。此时不要急着重装,先尝试:

brew update brew upgrade

如果还有问题,可以:

brew missing

它会列出当前已经安装但缺少依赖的包。针对这些包brew reinstall 包名往往就能恢复。如果实在不行,最彻底的方案是备份清单后重装Homebrew:

brew bundle dump

这个命令会把当前所有安装的formula和cask导出为一个Brewfile。重装Homebrew后,执行brew bundle,就能按清单把所有软件装回来。这个技巧在换新电脑时也非常实用。

6. 如果只是想轻度使用,有没有替代品?以及我现在的真实建议

6.1 替代方案的现实对比

总有人问“不装Homebrew行不行”。答案是:如果你的需求只是使用系统自带的东西,当然可以。但一旦你想自己装点工具,有几个替代方案:

  • MacPorts:老牌包管理器,文件也集中在/opt/local下,但它更依赖手动编译,安装大包时速度慢,而且用户数量远小于Homebrew,遇到问题的参考资料少。
  • 手动下载二进制:比如去官网下载已经编译好的包,自己放在/usr/local/bin下。这种方式适合单个软件,但依赖多时就会失控。
  • Docker容器:如果你只要命令行服务,比如跑某个数据库,可以在Docker容器里跑,不需要在宿主机装。但Docker本身也依赖更底层的东西,且占用资源比brew service高不少。

对比下来,Homebrew的社区维护规模和资料丰富度是最好的。它不是一个完美的方案,但它是“如果你只想轻松装软件”的最优解。

6.2 我给新用户的真心建议

以我自己和带过的新同事来看,最值得花时间的不是记忆一堆命令,而是建立起“先用brew查,再决定装不装”的思维习惯。遇到一个工具,先brew search、brew info,能省很多网上找教程的精力。

另外,建议每个月做一次例行维护:brew update && brew upgrade && brew cleanup。这个操作耗时不多,但能让你的系统长期保持清爽。我见过太多人的机器上堆着好几个旧版本的OpenSSL、Ruby、Node,不仅占磁盘,还可能在编译某些软件时导致奇奇怪怪的兼容性问题。

还有一个小习惯:在装任何大型依赖较多的软件时,先看一眼它会新增多少依赖。比如有些工具会连带装几十个库,你如果只是临时用一次,装完记得brew uninstall 工具名 && brew autoremove,防止你的Mac变成“依赖垃圾场”。

6.3 回扣标题的最后一句话

说回那个标题,为什么Mac用户最后都会装上它?我的答案很简单:因为它是那个把“自由”和“可控”结合得最好的工具。你既可以像App Store一样方便地安装、更新、卸载,又能清楚地知道自己的电脑里有什么,也可以随时绕开它去做更底层的操作。这一层体验,是很多不愿折腾的人最终也愿意妥协的原因。

如果你还没装,找台不重要的Mac先试一下,不用怕搞坏,最坏情况也就是多花一个小时重装系统。但是一旦你习惯了这个工作流,你会发现自己再也回不去手动拖dmg的老路子了。

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

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

立即咨询