ARTICLE DETAIL

资讯详情

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

M1 Mac安装Homebrew完整指南:arm64路径、环境变量与避坑

M1 Mac安装Homebrew完整指南:arm64路径、环境变量与避坑 刚拿到M1 Mac那阵子我做的第一件事不是装微信也不是调输入法而是打开终端敲下Homebrew的安装命令。原因很简单MacOS上想舒服地管理开发工具、命令行软件和一堆开源组件Homebrew基本是绕不开的入口。但M1芯片这一代和以前的Intel机器真的不一样架构从x86_64换成了arm64Homebrew的默认安装路径、环境变量配置、甚至报错信息都跟着变了。我前后在三台不同配置的M1设备上装过踩的坑够写一篇长文。这篇就聊聊MacOS下安装Homebrew这件事在M1芯片上的完整打法从为什么要这么选、每一步在干什么到出错了怎么救争取让你一次装完不用返工。适合刚入手M1/M2系列机器的新手也适合从Intel老机器迁移过来、发现原来的经验不管用了的老用户。1. 为什么M1 Mac装Homebrew和Intel机器不是一回事1.1 芯片架构变了软件路径跟着变Intel时代的MacCPU是x86_64架构Homebrew默认把所有东西装在/usr/local这个目录下二进制文件放在/usr/local/bin库文件放在/usr/local/lib。这套约定用了十几年几乎成了Mac开发的肌肉记忆。到了M1芯片CPU换成了Apple自研的arm64架构Homebrew官方为了区分两套体系把arm64版本默认装到了/opt/homebrew。这个改动不是为了标新立异而是有实际原因的。/usr/local在M1机器上依然可能被Intel版本的程序占用如果arm64的Homebrew也往里塞两套架构的二进制文件混在一个目录里PATH指向谁、链接到哪个库全乱套。分开目录之后Intel版和arm64版可以共存你甚至能同时装两个Homebrew各管各的。所以第一步要建立的心理预期是网上大量Intel时代的教程路径部分对M1已经失效了别照抄。1.2 Rosetta 2 与原生 arm64 的取舍有人会问既然M1能跑Rosetta 2苹果的x86_64指令翻译层那我直接装Intel版Homebrew不就行了技术上确实可行用arch -x86_64前缀就能在M1上跑x86_64的brew。但我不推荐这条路作为主方案理由有三点。第一是性能损耗。Rosetta 2虽然做得很出色但翻译执行终归有开销编译大型软件时能明显感觉到慢一截。第二是依赖链混乱。Homebrew装的很多包会互相依赖一旦你的brew是x86_64的它拉下来的依赖默认也是x86_64久而久之你的开发环境变成一锅x86_64的汤而系统本身是arm64的某些场景下会出现链接错误。第三是未来趋势。新版本的开源软件优先发布arm64的预编译包bottle你用Intel版brew反而可能拿不到最快的预编译产物被迫本地编译时间成本更高。注意Rosetta 2 不是不能用它在需要运行某些只有x86_64版本的商业软件或老工具时依然有价值。但作为Homebrew的日常主力优先选原生arm64版本是更省心的做法。1.3 目录结构差异带来的连锁反应装完之后你会发现M1上which brew返回的是/opt/homebrew/bin/brew而不是Intel教程里那个/usr/local/bin/brew。这个差别会影响到很多东西你写脚本时硬编码的路径要改配置文件里引用的库路径要改甚至某些IDE自动探测编译工具链时也需要你手动指定。更隐蔽的是PATH的优先级问题。如果你的PATH里/usr/local/bin排在/opt/homebrew/bin前面那么当某个命令在两个目录下都存在时系统会优先用Intel版本的那个这时你可能遇到明明装了新版本却跑的是老版本的诡异现象。这个坑我踩过排查了半天才发现是PATH顺序的问题。所以第4节讲环境变量配置时路径顺序是重点别跳过。2. 安装前的准备工作与前置检查2.1 系统环境自查清单动手之前先花两分钟确认几件事能省掉后面很多莫名其妙的报错。第一确认你的MacOS版本点击左上角苹果菜单进关于本机看一眼一般建议保持在较新的正式版太老的系统可能缺少某些依赖组件。第二确认磁盘剩余空间Homebrew本体不大但后续你装的软件包会越滚越多至少留出10GB以上的余量我见过有人装了上百个包之后磁盘告急。第三确认当前登录账户是管理员账户。Homebrew的安装脚本需要创建目录、修改权限普通标准账户权限不够会中途失败。第四确认终端用的是哪个shell。MacOS从Catalina开始默认shell从bash换成了zsh这直接影响你后面要往哪个配置文件里写环境变量。终端里敲echo $SHELL返回/bin/zsh就是zsh返回/bin/bash就是bash。2.2 Xcode Command Line Tools 是关键前置Homebrew本身是个包管理器但它依赖很多编译和下载工具其中最重要的就是Xcode Command Line Tools。这里面包含了git、clang编译器、make等一整套开发基础工具。如果没装Homebrew安装过程中会反复提示你安装甚至直接卡住。正常流程是Homebrew安装脚本会自动检测并触发安装但自动触发有时候会因为网络问题失败。稳妥的做法是手动先装终端执行xcode-select --install弹窗点安装等进度条走完。装完之后用xcode-select -p验证能输出一个路径就说明就位了。这一步下载量不算小网速慢的话耐心等等国内网络环境下这一步是整个流程里最容易卡的地方之一。提示如果xcode-select --install提示无法下载或者一直转圈可以检查一下系统时间和网络状态。系统时间偏差过大会导致证书验证失败这是很多人忽略的细节。2.3 网络与磁盘的现实考量国内直接访问Homebrew官方源确实会慢这不是什么秘密。安装脚本要从远端拉取一堆文件安装完成后每次brew install也要下载软件包。所以实际动手前我建议先把镜像源方案准备好具体配置方法放到第4节讲这里你只需要知道提前想好加速方案能让你少等很多时间。磁盘方面再补充一句Homebrew的缓存目录默认在~/Library/Caches/Homebrew它会保留下载过的安装包时间长了可能占用好几个GB。这个缓存不是必须常驻的后面第6节讲清理时会细说。另外如果你打算做开发建议把项目目录也规划一下别都堆在桌面或下载文件夹系统盘的整洁度直接影响长期使用的体验。3. 正式安装三种方式的手把手操作3.1 官方脚本安装最推荐这是最标准也最省事的路径。打开终端执行下面这条命令/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)这条命令的结构值得拆开看curl -fsSL里的-f表示遇到服务器错误就失败而不是输出错误页面-s是静默模式不显示进度-S是出错时显示错误-L是跟随重定向。/bin/bash -c则是把下载到的脚本内容交给bash执行。理解了这个结构后面遇到脚本拉取失败时你才知道问题出在哪一环。执行后脚本会列出它将要做什么包括创建哪些目录、安装哪些组件然后要你按回车确认。M1机器上它会自动识别架构把Homebrew装到/opt/homebrew。整个过程视网络情况几分钟到十几分钟不等。装完之后脚本通常会提示你还需要执行两条命令把brew加入环境变量千万别忽略这个提示很多人就是漏了这步导致敲brew提示找不到命令。3.2 手动解压安装法脚本失败时的备选脚本安装偶尔会因为网络或权限问题失败这时候手动安装是可靠的备选。原理很简单把Homebrew的代码仓库直接下载解压到目标目录然后自己配置环境变量。sudo mkdir -p /opt/homebrew sudo chown -R $(whoami):admin /opt/homebrew curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C /opt/homebrew第一行创建目录第二行把目录所有权改成当前用户这步很关键否则后续brew操作会频繁要求sudo而Homebrew官方明确不建议用sudo跑brew第三行下载并解压。--strip 1的作用是去掉压缩包顶层的那层目录结构让内容直接落在/opt/homebrew下。手动装完之后同样需要配置环境变量方法见下一节。3.3 镜像源加速的正确姿势国内环境下我一般会走这一步。把下面几行写进你的shell配置文件zsh是~/.zprofilebash是~/.bash_profile再重新加载export HOMEBREW_BREW_GIT_REMOTEhttps://mirrors.ustc.edu.cn/brew.git export HOMEBREW_CORE_GIT_REMOTEhttps://mirrors.ustc.edu.cn/homebrew-core.git export HOMEBREW_BOTTLE_DOMAINhttps://mirrors.ustc.edu.cn/homebrew-bottles这里解释下三个变量的分工HOMEBREW_BREW_GIT_REMOTE管的是brew本体这个仓库HOMEBREW_CORE_GIT_REMOTE管的是核心软件配方仓库HOMEBREW_BOTTLE_DOMAIN管的是预编译二进制包的下载地址。三个都配上安装和后续装包才能全面提速。配置完记得执行source ~/.zprofile让改动生效。注意使用镜像源后如果遇到某个包下载失败可以临时用HOMEBREW_BOTTLE_DOMAIN清空该变量走官方源试一次判断是镜像同步延迟还是包本身的问题。3.4 安装完成的验证与目录确认装完别急着用先做几项验证。执行brew --version能输出版本号说明命令可用。执行which brewM1上应该返回/opt/homebrew/bin/brew。执行brew doctor这是官方自带的体检命令它会检查你的环境有没有配置不当的地方。注意brew doctor经常输出一堆警告但未必都是问题比如它可能提示某些第三方工具不在它管理范围内这类警告可以忽略。再执行brew config会显示你的系统信息、Homebrew版本、HOMEBREW_PREFIX等关键参数确认HOMEBREW_PREFIX指向/opt/homebrew就对了。这几步做完你的Homebrew就算正式落地了。4. 环境变量配置与常见坑位4.1 zsh和bash的配置文件别搞混MacOS现在默认zsh但很多人从老教程里抄的是bash的配置方法往错误文件里写环境变量写完发现不生效还以为安装失败。这里理清楚zsh的登录shell读~/.zprofile交互式shell读~/.zshrcbash对应的是~/.bash_profile和~/.bashrc。环境变量这类在每次开终端都要生效的配置zsh写~/.zprofile或~/.zshrc都行我个人习惯写~/.zprofile因为它是登录时加载适合放PATH这类不怎么变的东西。4.2 PATH配置的写法与顺序最省事的写法是直接把brew的shellenv挂进去Homebrew安装完成后一般会给你现成的命令echo eval $(/opt/homebrew/bin/brew shellenv) ~/.zprofile eval $(/opt/homebrew/bin/brew shellenv)brew shellenv会输出一整套环境变量设置包括PATH、MANPATH、INFOPATH等把它eval一下相当于自动配好所有。第一行是写进配置文件永久生效第二行是当前这个终端立刻生效。如果你想手动控制也可以直接写export PATH/opt/homebrew/bin:$PATH但记得把/opt/homebrew/bin放在前面保证arm64版本优先。这个顺序问题在第1.3节提过PATH顺序不对会导致用错版本的命令。4.3 镜像源变量的持久化第3.3节那三个镜像变量如果你只是在终端里临时export关掉窗口就没了。要让它每次都生效就写进~/.zprofile。写完之后有个细节要注意如果你之前已经装过一些包切换源之后可能需要执行brew update让配方仓库同步一次。另外如果哪天你想临时切回官方源验证问题不用改配置文件直接在命令前面加变量覆盖即可例如HOMEBREW_BOTTLE_DOMAIN brew install wget这种临时覆盖的写法在排查问题时挺好用。提示~/.zprofile里的内容不要堆太多保持能一眼看懂。我见过有人把十几条环境变量混在一起后来自己都忘了哪个是干嘛的出问题根本没法排查。5. 安装后的日常操作与高频命令5.1 基础命令速查表Homebrew装好了日常用起来无非就那些命令我把最高频的整理成表方便随时对照。命令作用brew install 包名安装软件包brew uninstall 包名卸载软件包brew search 关键词搜索可用包brew list列出已安装的包brew info 包名查看包详情brew update更新Homebrew自身和配方仓库brew upgrade升级已安装的包brew outdated查看哪些包有新版本brew cleanup清理旧版本和缓存brew doctor环境体检brew update和brew upgrade是最容易被混淆的一对。前者是更新Homebrew这个工具本身以及它的软件配方库后者才是更新你装的那些软件。可以先brew update再brew upgrade顺序别反。5.2 用 brew services 管理后台服务装完一些需要常驻运行的软件比如数据库、Web服务器Homebrew提供了brew services来管理它们的后台运行状态。常用命令brew services list brew services start nginx brew services stop nginx brew services restart nginxbrew services list会列出所有可管理的服务及其状态。相比手动配置开机自启这种方式的好处是配置跟包绑定卸载包的时候自启动项也一并清理不会留下系统里的孤儿残留。我强烈建议需要常驻的服务都用它来管能省不少事。5.3 M1下编译类软件的注意事项有些包没有arm64的预编译版本brew install时会转为本地编译。这时候的注意事项有几个。第一再次确认Xcode Command Line Tools装好了编译离不开它。第二编译类软件对CPU和内存占用高笔记本记得插电。第三如果编译报错提示找不到某个头文件或库多半是依赖缺失可以试试brew install那个报错里提到的依赖名。还有一种情况是某些包只有x86_64版本这时候可能需要借助Rosetta用arch -x86_64 brew install 包名但前提是你得先有个x86_64的brew。这就是第7节要讲的共存方案先记住有这么回事。6. 报错排查实录与避坑清单6.1 典型报错速查下面这些是我在M1上实际遇到过或者帮别人处理过的报错整理成表方便对号入座。报错现象可能原因处理思路command not found: brew环境变量没配或没生效检查~/.zprofile重开终端或source一下安装脚本拉取超时官方源访问慢配置镜像源后重试Permission denied相关目录权限不对确认/opt/homebrew归属当前用户提示需要sudo才能装目录owner是rootchown改回当前用户某个包装完命令找不到PATH顺序或链接问题brew link 包名检查PATHbrew doctor报大量警告环境有历史残留逐条读多数可忽略重点是PATH类这张表覆盖了八成以上的常见问题。排查的核心思路就一条先看报错里提到的路径和权限再看环境变量最后才怀疑包本身。6.2 权限问题的根源与正确解法M1版Homebrew最讲究的一点是不要用sudo。官方设计上/opt/homebrew及其子目录都应该属于当前登录用户。如果你在安装时用了sudo创建目录导致owner是root那么后续不带sudo的brew操作就会各种权限失败而你一旦习惯了用sudo跑brew又会引入新的权限混乱比如缓存文件变成root所有之后普通用户跑brew又失败了。正确的解法是老老实实把目录权限改回来sudo chown -R $(whoami):admin /opt/homebrew执行完再验证一下不带sudo跑brew doctor不报权限错误就对了。这个坑我一开始也踩过原因就是照抄了某篇Intel时代的教程。6.3 卸载与残留清理有时候环境彻底乱了重装比修补更快。Homebrew自带的卸载脚本/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)执行前它会提示你有哪些东西会被删除。注意这个脚本只删Homebrew管理的内容你自己放进/opt/homebrew里的私货未必清得干净。卸完之后手动检查/opt/homebrew目录是否还在以及shell配置文件里那几行环境变量是否还留着残留的PATH设置会让新装的brew出现奇怪行为。另外缓存目录~/Library/Caches/Homebrew和日志目录~/Library/Logs/Homebrew也可能有残留手动删掉即可。清理这事别嫌麻烦干净的卸载是干净重装的前提。7. 多版本共存与进阶实践7.1 同时保留arm64与x86_64两个Homebrew有些场景下你确实需要x86_64版本比如某个只在Intel下编译的商业工具。这时候可以在M1上再装一个x86_64的Homebrew装到/usr/local下和arm64版本互不干扰。安装时用arch -x86_64 /bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)装完之后默认的brew命令还是走arm64版本要调用x86_64那个得加前缀arch -x86_64 /usr/local/bin/brew。这种双版本共存虽然灵活但也增加了心智负担除非真的有需求否则不建议新手折腾。7.2 用 Brewfile 做环境备份与迁移如果你有多台Mac或者经常重装系统把已装的包导出成清单会非常省事。Homebrew内置了bundle功能brew bundle dump --file~/Brewfile brew bundle install --file~/Brewfile第一条把当前所有已装的包、甚至通过mas装的App Store应用都导出到文件第二条在新机器上一键还原。我换机器或者重装之后基本都靠这一招十几分钟就能把开发环境铺回来。导出的Brewfile建议放进你的代码仓库或云盘同步这样真出事的时候不至于两手空空。提示Brewfile里记录的是包名列表还原时会重新下载安装所以镜像源配置在新机器上依然要先做好否则还原过程会非常煎熬。回想我自己从第一次在M1上装Homebrew的手忙脚乱到现在闭着眼也能把环境铺起来中间最大的体会就是M1这一代不能照搬Intel时代的经验路径、权限、架构这三件事想清楚了剩下的都是顺水推舟。最后再分享一个小技巧装完之后不妨把brew doctor和brew config的输出存一份到笔记里等哪天环境出问题拿出来对比一下差异往往一眼就能看出是哪一步被改动了。这个习惯帮我省下过不少排查时间你也可以试试。
返回列表