ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Homebrew全攻略:安装、常用命令与避坑指南

Homebrew全攻略:安装、常用命令与避坑指南 如果你刚换了Mac或者正打算把开发环境迁到macOS上那么十有八九会听到一个词Homebrew。它是macOS上最流行的软件包管理器作用一句话就能说清帮你用命令行快速安装、升级、卸载各种软件和库同时自动处理依赖关系。很多开发者把它称为“macOS 缺失的包管理器补丁”从Python、Node.js、OpenJDK到MySQL、Chrome、微信都能通过它一键搞定。这篇文章不打算讲那些官网就能查到的抽象概念而是围绕“Homebrew的作用及基本命令”这个主题把安装、日常命令、常见报错、以及几年下来踩过的坑全部过一遍。不管你是刚接触Mac的小白还是已经被brew折磨过的老用户应该都能在里面找到点有用的东西。先放个结论这工具值得你花半小时学会之后能帮你省下无数找安装包、配环境变量的时间。1. Homebrew到底是什么为什么Mac开发者离不开它1.1 先理解包管理器这件事如果你以前用Windows比较多第一次接触包管理器可能会觉得陌生。其实可以把它理解成“命令行版的应用商店”但比应用商店更贴近开发者场景。应用商店装的是面向普通用户的APP包管理器装的是开发过程中的各种依赖、编译工具和库。你执行brew install ffmpeg它会把ffmpeg本身连同它依赖的x264、libvpx、mp3lame等一系列库全部装好不需要你手动去各个项目官网下载dmg或源码包。包管理器最大的价值有三点一是自动化安装第三方库时不用手动管依赖二是版本可控想升级就升级想锁版本就锁版本三是卸载彻底不像某些dmg软件一样拖进废纸篓还会留一堆配置文件。macOS本身用的包管理机制并不像Linux那样系统化App Store只覆盖一部分图形应用大部分命令行工具和开发者库都散布在各个网站Homebrew刚好把这块空白补上了。1.2 Homebrew和App Store、dmg安装包的区别很多人会问为什么不用App Store不是挺好的吗这里面的差异比较大我用一张表说明对比项HomebrewApp Storedmg/pkg安装范围命令行工具、库、GUI软件都能装只能装App Store审核过的应用一包一装来源分散依赖处理自动处理依赖自带运行库较少关心依赖经常要求你手动装依赖更新方式brew upgrade一条命令全部更新系统提示更新需要重新下载安装包卸载方式brew uninstall干净彻底拖废纸篓但仍可能有残留拖废纸篓手动清残留是否自动配置环境变量多数公式会提示部分自动配置不需要环境变量经常需要手动配置从表格能看出来Homebrew的命令行风格和Linux的apt、yum很像。它不是在跟App Store抢饭碗而是换了种玩法把软件安装变成可脚本化、可复现的操作。举个例子你新买一台Mac只需要在自己的脚本里写上十几条brew命令就能把开发环境重建出来这在dmg时代几乎不可能。1.3 Homebrew在macOS系统中的角色定位Homebrew安装后的核心目录在Intel处理器的Mac上是/usr/local在Apple Silicon上则是/opt/homebrew。这个区别很重要因为后面所有PATH配置、权限问题都跟它相关。它并不是像大多数软件一样把自己装进/Applications而是把自己作为一套独立的软件树管理在一个自定义前缀目录下。这种设计有个明显的好处不污染系统自带的/usr/bin。你可以放心安装新版本的Python、Git、OpenJDK而不必担心和macOS系统自带的旧版本冲突。Homebrew内部通过“Cellar”目录存储所有安装的软件版本然后通过软链接把当前版本暴露到/usr/local/bin或/opt/homebrew/bin。这些概念刚开始不用记太死但知道它们能帮你理解为什么有时候which python3指向Homebrew目录有时候又指向系统目录。2. 安装与卸载从零开始配置Homebrew环境2.1 安装前的检查和必要组件安装Homebrew前先确认系统满足最低要求。以当前主流的Homebrew 4.x为例它要求macOS 11 Big Sur及以上。如果你的系统比这还老后面有一节专门讲旧系统怎么办这里先按新系统来。然后需要确保macOS的Command Line Tools已经装好。这个组件包含了编译软件必需的clang、git、make等一系列工具也是Homebrew安装时经常依赖的东西。你可以在终端里执行xcode-select --install如果弹窗说已经安装那就直接进行下一步。如果提示找不到装完再来。很多新手在这步会卡很久其实不用启动完整版Xcode命令行工具只有几百MB比十几GB的Xcode轻量多了。2.2 官方安装脚本与国内镜像加速确认Command Line Tools就绪后用官方脚本安装即可/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)这个脚本会一路检查系统、创建目录、下载Homebrew仓库。但国内网络直连GitHub经常很慢如果你看到脚本长时间卡在Updating Homebrew或者curl报错不要傻等。更常用的方案是设置国内镜像环境变量后重新跑安装脚本。以清华镜像为例在执行安装脚本前先输入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 install下载预编译包时默认会走镜像源速度会明显提升。别一上来就怀疑是电脑问题90%的安装失败都是网络连接GitHub不稳定导致的。2.3 验证安装与后续配置安装完成后先执行brew --version确认能输出版本号。在Apple Silicon的Mac上脚本通常会在最后提示你需要把Homebrew目录加入PATH。常见做法是把下面这行写入~/.zshrcexport PATH/opt/homebrew/bin:$PATH写入后重新加载一下配置文件再执行which brew如果输出/opt/homebrew/bin/brew说明环境变量生效了。接下来建议跑一次brew doctor它会检查系统设置、依赖库版本、目录权限等有没有问题。不要害怕那个长长的输出你只需要关注标红区域通常给出的处理建议也很直白照着执行就行。2.4 卸载Homebrew和清理残留有些时候你需要彻底卸载Homebrew或者安装过程坏到不行想从头再来。官方其实提供了一个卸载脚本/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)它会列出将要删除的内容并询问确认。但如果之前手动改过目录结构或者曾经用sudo操作过脚本可能漏掉部分残留。我实际遇到过“卸载完再安装时提示目录非空”的情况主要残留位置集中在以下几个地方/usr/local/CellarIntel Mac或/opt/homebrew/Cellar/usr/local/Homebrew或/opt/homebrew~/Library/Caches/Homebrew~/Library/Logs/Homebrew/Library/Homebrew卸载前建议先把brew list导出成清单方便以后重装。清理时务必小心不要误删其他软件的数据。如果你只卸载某一个软件而不是整个Homebrew用brew uninstall --force就行不需要碰这些目录。3. 核心命令速查能解决90%日常需求的基本操作3.1 安装、卸载与清理软件的完整闭环日常用得最多的就是brew install。安装命令行工具直接写brew install wget brew install openjdk17 brew install maven如果软件有多个版本可以在名称后加版本号比如openjdk11、python3.9。需要装图形界面软件时用--cask参数brew install --cask google-chrome brew install --cask visual-studio-code brew install --cask wechat这个--cask是Homebrew管理GUI应用的子模块安装时会从官方渠道下载dmg或pkg并自动完成挂载和安装效果相当于帮你省掉了“下载、打开、拖拽、退出”这一整套手动流程。有些老教程还会写brew cask install但在Homebrew 2.6之后cask命令被并入brew install --cask老写法已经过时了。卸载和清理要养成配套习惯brew uninstall wget brew uninstall --cask google-chrome brew autoremove brew cleanupbrew autoremove会删除不再需要的依赖比如你卸载了一个软件它当年自动装好的几十个依赖库如果没有被别的东西引用就会被清掉。brew cleanup则是清理旧版本安装包和缓存。我把这三个命令包装成一个习惯卸载软件后先autoremove再cleanup这样Homebrew的存储占用能长期保持在一个健康水平。3.2 查询与查找搜索、信息、依赖关系装之前先搜索一下能避免不少坑brew search maven brew info mysql brew info --cask google-chromebrew info显示的信息很有价值包括当前稳定版本、依赖关系、安装后需要做什么配置caveats以及是否为keg-only。keg-only这个词见得多含义是“这个软件不会主动链接到PATH里”比如OpenJDK和Python都经常标记为keg-only原因是怕和系统自带版本冲突。遇到这种提示要么手动添加软链接要么按提示执行额外的配置命令。如果想看某个公式的依赖树可以执行brew deps --tree ffmpeg它会输出一棵依赖树让你知道安装这个软件会牵连多少库。另一个实用的是brew uses --installed git能反查已安装的哪些软件依赖了Git。这些查询类命令不会修改系统可以放心多试。3.3 更新、升级与版本管理Homebrew本身和它管理的软件是两套升级逻辑。升级Homebrew本身用brew update更新软件列表和可用版本。升级某个软件用brew upgrade wget想一次升级所有已装软件直接brew upgrade。但在准备全量升级前最好先看一眼有哪些可更新brew outdated这个命令会列出所有有新版本的软件。我个人的习惯是先跑brew outdated再决定是全部升级还是只挑几个重点升级。原因很简单有些软件升级后配置不一定兼容比如某个自定义的配置文件路径变了或者依赖的大版本变了。如果你的工作环境不能出一点差池可以用brew pin锁定版本brew pin mysql brew unpin mysql锁定后brew upgrade会跳过被pin的软件。这是团队环境或生产环境里非常实用的功能小项目单人开发可能用不上但值得知道。3.4 服务管理让后台软件开机自启源码包安装的软件里有一部分是以守护进程形式运行的比如MySQL、Redis、Nginx、PostgreSQL。以前你需要手动去配置launchd plist文件Homebrew提供了一个更友好的封装brew services。先看当前所有服务状态brew services list启动某个服务并设置开机自启brew services start mysql停止服务并取消开机自启直接执行brew services stop mysql。如果想临时跑一次不想注册开机项可以使用brew services run mysql。这三个命令的区别很多新手容易绕晕实际用下来记一条经验日常开发用start/stop就够了如果只是临时测试某个服务尽量别用start免得电脑开机自动拉起一堆进程。有一类服务不适合用brew services管理比如你自己编译的一些一次性脚本服务或者需要自定义复杂启动参数的进程。这时更合适的是手动写launchd plist。brew services适合那些安装后“开了就不管”的常见服务。3.5 查看环境状态doctor、config、list当Homebrew行为异常时第一反应不是删库重装而是先诊断brew doctor它会检查常见问题比如目录权限不对、链接失效、重复安装等。很多时候输出的建议就是一行命令执行完就解决了。另一条实用命令是brew config它会列出Homebrew版本、macOS版本、CPU架构、HOMEBREW_* 环境变量等信息。配合国内镜像排查时我经常先跑它确认是否真的走了镜像源避免环境变量没生效还白折腾。查看装了哪些东西brew list brew list --cask brew list --formula这里--formula和--cask区分了命令行软件和图形软件。如果你的机器上装了上百个软件还可以用brew leaves查看“直接安装的顶层软件”排除掉依赖项。这个命令在统计环境清单时特别好用。4. 常见问题与排查技巧实录4.1 安装脚本一直卡住或报错多半是网络问题先看一个非常典型的错误执行官方安装脚本后长时间停留在Updating Homebrew...然后curl断开或者git clone失败。这不一定是Homebrew坏了而是在下载GitHub上的仓库时网络不稳定。最常见的解决方案是像我前面提到的先设置国内镜像环境变量再重装。另外安装某些软件时可能出现下载预编译包bottle失败的情况。Homebrew的bottle默认从ghcr.io下载速度同样不稳定。配置了HOMEBREW_BOTTLE_DOMAIN后安装包会从镜像拉取。这一步做完绝大多数“下载失败”问题都会明显缓解。还有一个小细节如果在终端里使用了一些网络转发工具有时反而会因为SSL证书问题导致curl失败。这里不讨论具体工具只说一句尽量让Homebrew走系统默认网络和镜像源问题最少。4.2 brew update 慢和“不能更新”报错很多人会遇到brew update卡住以及下面这种报错Error: fatal: not in a git directory这种通常是因为本地Homebrew仓库的git remote源指向了GitHub而更新时拉不下来。解决办法是直接把remote切到镜像git -C $(brew --repo) remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git git -C $(brew --repo homebrew/core) remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git git -C $(brew --repo homebrew/cask) remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git针对不同安装路径和版本brew --repo homebrew/core可能输出不同的目录不过命令本身会自适应直接执行就行。切换完再brew update基本能恢复正常。记住这不是Homebrew本身的bug纯粹是网络环境导致的git同步问题。4.3 macOS版本兼容性问题Homebrew 4.0 不再支持 10.15这几年关注Homebrew的人应该都知道官方升级策略越来越明确。Homebrew 4.x把最低系统要求提到了macOS 11 Big Sur也就是说Catalina10.15及更早的机器没法再用新版Homebrew更新软件。如果你还在用旧系统但有不想升级的苦衷能走的路大致有三条第一条安装旧版Homebrew。Homebrew 2.x时代还是支持10.15的。我见过有人在旧Mac上把仓库切到2.x分支继续用大概操作是进入$(brew --repo)目录后执行git checkout到指定版本但后续新增软件包不再保证兼容属于“能用但别指望长期维护”的状态。第二条直接下载官方独立安装包或dmg来替换特定软件绕开Homebrew。比如某些需要特定版本的数据库直接从官网下载tar.gz包自己配置也能正常工作。第三条升级系统到受支持的版本。这个最省心但要考虑你的老设备跑不跑得动新系统。兼容性问题没有完美解只能根据自己这台机器的使用定位来选择。我个人的看法是如果这台机器还有重要开发需求尽早规划升级如果只是做轻量办公旧版Homebrew凑合用也问题不大。4.4 权限问题与 command not found新用户最常遇到的另一个问题是刚装完Homebrew执行brew却提示zsh: command not found: brew。原因一般是两个壳的PATH变量里没有Homebrew目录或者安装时用了sudo导致目录属主变成了root。如果是PATH问题按前面说的把export PATH/opt/homebrew/bin:$PATH写入~/.zshrc或~/.bash_profile即可。如果是权限问题需要把目录归还给当前用户sudo chown -R $(whoami):admin /opt/homebrew这个命令同样适用于Intel Mac下的/usr/local。我特别不建议在执行brew install时加上sudo。Homebrew的设计初衷就是“不需要root就能管理软件”装到系统目录之外的前缀里。一旦用了sudo它会把部分文件写入到root所有后续每次操作都可能出现权限报错处理起来非常麻烦。4.5 残留问题升级失败后目录和进程清理Homebrew升级版本后旧的目录结构可能残留。最常见的是以前Homebrew 1.x或2.x留下的~/.homebrew、/usr/local下的一部分旧目录和新版本冲突。比如你重装Homebrew后系统提示某个Cellar子目录“已存在且非空”这时不要暴力删除先看里面有没有你在用的小项目或配置数据。更常见的残留是软件的旧版本。比如python3.9更新到了3.9.5旧的3.9.4目录仍留在Cellar里。用brew cleanup能清除旧版但如果某个软件被标记为“keg-only且没有其他版本依赖”autoremove也可能把它连带删掉。所以每次批量清理前我习惯先跑brew list记录当前清单出问题还能知道少了什么。5. 几年实践经验总结Homebrew怎么用才舒服5.1 我的几个使用习惯用Homebrew这几年我慢慢形成了一套相对固定的工作流。首先是安装命令习惯性写成一行把软件来源和用途写在注释里方便以后追溯。比如# 开发基础 brew install git brew install openjdk17 brew install maven # 日常工具 brew install --cask visual-studio-code brew install --cask wechat其次是「分组安装」。我会把开发环境、日常办公、媒体处理等不同场景的命令分组记录配合brew bundle还能自动生成 Brewfile当前机器上装了什么一目了然。要迁移到新机器时只需要把Brewfile带过去执行一遍基本就恢复了七八成开发环境。第三是定期体检。我基本上每隔一两周跑一次brew doctor、brew outdated、brew cleanup三个命令。这个习惯帮我规避了好几次“因为某天突然升级导致环境崩掉”的风险。大版本升级前我会先看看brew info里有没有特别提示比如配置文件迁移再决定是否升级。5.2 值得一提的周边扩展Brewfile、mas与版本管理工具Homebrew本身能力已经很强但更舒服的玩法是搭配周边工具。brew bundle是官方自带的功能通过brew bundle dump把所有已装软件导出成Brewfile再用brew bundle install一键恢复。我还在Brewfile里用tap和mas管理更细粒度需求mas可以从Mac App Store安装部分应用。比如说你可以这样brew install mas mas list mas search Xcode mas install 497799835用法是先通过mas search找到应用ID然后安装。如果某天brew list看到的软件不能满足你说“我要整套环境”Brewfile就是解决方案。另外多语言版本管理方面我会把Homebrew和mise搭配使用用brew安装工具链本体用mise管理同一语言的不同版本避免在系统层面装太多重复的东西。5.3 给新手朋友的实在建议最后说点带情绪的经验。Homebrew确实强大但它不是万能的。它擅长的是“开源工具、命令行软件、开发者库”的安装管理对于某些商业软件、跨系统安装包还是老老实实去官网下载更好。别听别人说“所有软件都能用brew装”就去强行brew install有些软件的官网更负责任更新更快。另外安装时多看一眼输出的caveats信息。很多新手装完直接关终端之后再为“为什么python3指向的不是我装的版本”这种问题折腾半天。其实Homebrew通常已经把提示写在安装日志里了照着做就行。最后一条建议来自我的惯性翻车经验对brew upgrade保持敬畏生产环境的机器别在没备份的情况下盲目全量升级。把brew pin用起来锁住关键软件你就能安心享受Homebrew带来的便利。
返回列表