新Mac必装:Homebrew与RVM从零安装配置完整指南
新Mac到手或是重装完系统我每次都会先把Homebrew和RVM安排上。这两个东西在Mac开发里基本绕不开Homebrew负责把常用的命令行工具从网上拉下来装好RVM负责把Ruby版本和项目依赖管清楚。很多人一开始觉得不装也能写代码可等项目多起来系统自带的Ruby根本不敢碰gem权限报错能让人耗掉一晚上。这篇文章就把我从零开始装这套环境的完整过程、路径选择和踩过的坑写出来适合刚入手Mac开发的同学也适合想重装环境的人照着抄一份可复现的清单。1. 先想清楚为什么这两样缺一不可1.1 Homebrew不是“装个软件那么简单”Homebrew在Mac上的地位基本相当于手机上的应用商店不过是面向开发者的命令行版本。你用Mac写代码第一件事就是发现系统不自带git的常用扩展、没有wget、没有tree、没有vim的新版本。这些工具不是不存在而是散落在各个开源项目仓库里靠手动下载编译那叫一个折腾。Homebrew把这些工具统一收编一条brew install命令就能装好还会自动处理依赖。比如你装一个依赖libyaml的软件Homebrew会顺手把libyaml一起装掉卸载的时候也会连依赖关系一起理清楚。它背后的机制其实不玄每个包先下载到统一目录Mac普通用户称呼它Cellar再从Cellar里软链接到/opt/homebrew/bin或者/usr/local/bin。软链接的意思是系统在找可执行文件时通过这个链接就能直接启动Homebrew装好的程序。你不需要关心源码放在哪、编译选项怎么写Homebrew已经把大家验证过的配方封装好了。对我来说Homebrew真正解决的是“可复现”同一台电脑不管谁登录都能用同一套命令装出同一套环境。1.2 RVM是把Ruby版本冲突挡在门外的“隔离舱”RVM全称Ruby Version Manager核心用途是管理一台机器上的多个Ruby版本。Mac系统其实自带Ruby但那个版本由系统控制通常比较旧而且它归系统所有你如果拿sudo gem install装东西进去很容易把系统环境搞乱重则影响系统组件。我见过有人不小心覆盖了系统lib结果某些依赖Ruby的系统脚本直接罢工。更现实的问题是一个项目要求Ruby 2.7另一个项目用Ruby 3.2你不可能因为切换项目而反复重装系统自带版本。RVM把每个版本的Ruby装进用户目录下的独立目录互不干扰想切就切想删就删完全不影响系统自带那套。对比一下常见的Ruby版本管理方案会更清楚RVM的定位方案特点适合人群系统自带Ruby不可控版本老旧改坏会影响系统不建议直接用RVM用户目录安装功能全面自带gemset隔离新手友好社区资料多rbenv轻量通过shims控制命令路径喜欢极简、按需安装的人asdf可以管理多种语言运行时同时用Ruby/Node/Python的人选RVM而不是其他方案更多是因为它的文档完整、遇到的问题随便一搜都有答案而且gemset机制对项目依赖隔离特别直观不用一开始就理解shims那套原理。1.3 为什么是“Homebrew RVM”这套组合这套组合的搭配逻辑很简单Homebrew管系统基础软件RVM管Ruby这个世界。Homebrew本身也会用Ruby但它的职责是通用的包管理不负责隔离项目级依赖。RVM则专门负责Ruby版本和gem依赖隔离。两者并不重复。先装Homebrew是因为后续很多Ruby版本需要依赖openssl、readline、libyaml这类库RVM自己可以尝试用Homebrew帮你装依赖所以要发挥RVM的正常实力Homebrew在装上就先赢了一半。在多数教程里Homebrew和RVM经常被写成“Mac开发第一步”原因就是它们把最容易折腾的两个点提前解决了工具安装和语言版本管理。这两块一旦稳定后面装Node、Python、Go都只是brew install和rvm install的变体。2. Homebrew完整安装与配置步骤2.1 动手前先补齐命令行工具链Homebrew安装落地的前提是系统里有Xcode Command Line Tools它是一套命令行编译工具合集包含编译器、make、git等核心组件。没有它Homebrew即使装上后面装需要编译的包也会报错。检查当前芯片架构可以用这一句uname -m输出arm64就是M系列芯片输出x86_64就是Intel芯片。这个结果决定了后面Homebrew的安装路径建议先记住。安装Command Line Tools最简单的方式是打开终端输入xcode-select --install系统会弹窗让你确认然后开始后台下载。这个过程可能持续几分钟耐心等着别中途关掉终端。装完后可以用这个命令验证xcode-select -p如果输出一个/Library/Developer/CommandLineTools之类的路径说明已经就绪。2.2 安装脚本与两个架构路径的差别Command Line Tools就绪后安装Homebrew本身几乎是一条命令的事。以官方脚本为例/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)这条命令会用curl把官方安装脚本拉下来再用bash执行。安装过程中会要求输入开机密码终端里输入时不会显示字符这很正常不是卡住了。这里有个关键区别Intel芯片的Mac上Homebrew会把文件装在/usr/local而M系列芯片的Mac装在/opt/homebrew。原因是M系列芯片的系统整机保留了/usr/local给管理员使用Homebrew作为用户级软件被安排到独立目录里更安全也方便权限管理。所以M系列芯片装完后Homebrew的可执行文件在/opt/homebrew/bin/brewIntel芯片则在/usr/local/bin/brew。如果网络下载很慢可以尝试换个网络环境或者改用镜像加速。我个人建议先尽量用官方脚本把流程跑通因为后续更新、安装包时官方源的一致性最好。真要是网络条件不允许再考虑切换到可用的国内镜像安装方式但要注意镜像地址会随着社区维护而变动别随便拿来路不明的脚本执行。2.3 把brew接入当前Shell安装脚本结束时通常会提示一句“Next steps”告诉你需要把Homebrew的路径加到Shell配置里。这一步如果漏掉最常见的结果就是你已经装好了Homebrew但敲brew却提示找不到命令。现在Mac默认Shell是zsh所以配置文件一般是~/.zshrc。M系列芯片机器上推荐执行eval $(/opt/homebrew/bin/brew shellenv) ~/.zprofile如果不喜欢zprofile也可以追加到~/.zshrc效果一样只是两个文件加载时机不同。zprofile适合登录Shell时全局加载zshrc在每个新的交互式Shell窗口都会加载。我习惯同时把下面两行都写进去# 写入 ~/.zshrc eval $(/opt/homebrew/bin/brew shellenv)Intel芯片机器对应路径改成/usr/local/bin/brew。写完配置后执行source ~/.zshrc然后验证brew -v如果显示Homebrew版本号和安装目录说明PATH生效了一切正常。2.4 装好之后立刻干的三件事我一般装完Homebrew不会直接开写而是先做三件事。第一执行brew update更新一下本地的包索引。刚安装完时索引一般已经是最新但显式执行一次能确认Homebrew的更新通道正常。第二安装几个我离不开的基础工具brew install git wget tree htop这些几乎每个项目都会用到。wget是下载利器tree能直观展示目录结构htop是进程监控工具。有了Homebrew装它们确实只要一条命令。第三确认Homebrew的瓶子bottle下载机制是否正常。随便装一个小软件比如brew install cowsay cowsay hello如果这能正常输出说明整个Homebrew链路健康可以放心使用。别小看这步它能提前暴露网络、权限问题免得后面装大包时才发现不对劲。3. RVM安装与Ruby多版本管理实操3.1 准备依赖别让RVM裸奔RVM不只是下载一个Ruby二进制那么简单它经常需要从源码编译指定版本这时系统里就得有编译器和一些底层依赖。Homebrew已经装好了现在可以顺便把Ruby常用依赖一起补上brew install openssl readline libyaml libffi这些库分别负责安全连接、交互式命令行、YAML解析和函数调用。RVM在编译Ruby时如果找不到它们就算Ruby本体装成功后面跑项目也可能在bundle install阶段出现莫名其妙的报错。所以提前装好比等到报错再反向排查省时间得多。也可以用RVM自带的环境检查命令看看还缺什么rvm requirements它在安装RVM之后才能用会列出当前系统需要额外安装的软件包。如果列表里还有提示用Homebrew补齐即可。3.2 安装RVM并让它跟随Shell启动RVM官方推荐用curl拉取安装脚本\curl -sSL https://get.rvm.io | bash -s stable命令前面加一个反斜杠是为了避免使用Shell中可能配置的curl别名确保执行的是系统原生curl。-sSL参数意思是静默模式、跟随重定向、出错时显示错误。安装过程会下载RVM自身代码并把相关配置写进Shell配置文件。安装完成后先手动加载一下RVM然后验证source ~/.rvm/scripts/rvm type rvm | head -n 1type rvm正常输出如果是rvm is a shell function说明RVM已经被正确加载。再用rvm -v查看版本号确认。这里有个容易忽视的细节RVM是一个Shell函数不是普通可执行命令所以每次打开新终端时都必须让Shell自动加载它。RVM安装时会尝试往~/.zshrc里写一行source语句。要是你发现新开的终端敲rvm提示找不到多半是RVM安装脚本判断错了Shell类型或者你把配置写到了不加载的文件里。手动把下面这行加进~/.zshrc是最稳妥的兜底方案[[ -s $HOME/.rvm/scripts/rvm ]] source $HOME/.rvm/scripts/rvm3.3 安装指定Ruby版本并设置默认RVM装好后先看看它知道哪些Ruby版本rvm list known这个列表很长包含了各种发布版、头版、企业版Ruby。挑一个稳定的标准版来装比如3.2.2rvm install 3.2.2安装期间终端会滚动大量编译日志。第一次可能会比较久因为要从源码编译。RVM会尽量调用之前Homebrew装好的openssl等依赖。如果编译失败先看日志里的Error行通常能定位到具体缺什么库。装完以后把当前版本设为系统默认rvm use 3.2.2 --default--default的意思是以后每次打开终端RVM会自动加载这个版本的Ruby不用手动去use。验证一下ruby -v gem -v which rubywhich ruby输出应该指向~/.rvm/rubies/下面的路径而不是/usr/bin/ruby。看到这个路径你就知道当前使用的是RVM管理的Ruby和系统自带Ruby已经彻底分家。3.4 gemset项目依赖互不污染的关键RVM最让我离不开的功能就是gemset。它可以把不同项目的gem依赖隔离在不同的集合里。没有gemset时所有项目共用一套gem列表A项目用的gem版本升级B项目可能直接挂。有了gemset每个项目可以有自己的gem世界。创建一个gemset很简单rvm use 3.2.2my_project --create这句的意思是使用Ruby 3.2.2并创建/切换到名为my_project的gemset。之后你在这个终端里执行gem install装的都是my_project这个集合里的gem。项目之间切换非常灵活rvm use 3.2.2another_project --create想看看当前集合装了哪些gemgem list我通常把gemset名和项目名保持一致比如项目目录叫bloggemset就叫blog。这样看终端提示符就知道当前环境是哪一套不用费脑子记。如果哪天不需要了删除gemset也干净rvm gemset delete my_project不会残留任何文件在系统目录里。4. 安装过程中最常遇到的5个坑4.1 卡在Command Line Tools弹窗很多时候执行xcode-select --install系统弹窗说正在安装但进度条迟迟不动或者过一会儿就没反应了。此时不要反复去点。先检查一下是不是已经装好了xcode-select -p如果还是没有路径可以尝试重启电脑再执行一次。这个工具下载服务器在正常网络下一般没问题如果始终失败检查网络环境是否支持访问系统更新服务。注意不要自己去下载来历不明的命令行工具安装包容易碰到来路不明的编译链。4.2 脚本下载连接失败或速度极慢Homebrew安装脚本和RVM安装脚本都依赖外网资源网络不稳定时容易出现curl: (7) Failed to connect一类的报错。解决办法是按顺序来先重试一次很多时候是瞬时抖动持续失败就换网络环境比如从WiFi切到手机热点测试实在不行再考虑使用镜像安装方式。这里提醒一句网上很多修改Homebrew安装源的教程改的其实是~/.zshrc里的环境变量。可以改但一定要先备份原配置并且理解每个变量是干什么用的。否则以后Homebrew更新时容易被奇怪的环境变量绊住。4.3 终端提示rvm is not a function这个报错基本可以锁定为“RVM没有被Shell加载”。RVM是函数不是二进制文件Shell每次交互式启动时都要主动source它的脚本。如果配置没生效rvm命令自然找不到。先确认手动加载能不能成功source ~/.rvm/scripts/rvm rvm -v如果手动执行没问题说明问题出在配置文件加载顺序上。看看~/.zshrc里有没有那行source语句没有就加上。同时检查一下是不是zsh没有把~/.zshrc当成交互式配置加载比如某些终端登录Shell模式可能只读~/.zprofile。这种情况下在~/.zprofile里同样加上source语句也能解决。4.4 brew命令明明装了却找不到这种情况几乎都指向PATH配置问题。先输入which brew没有输出说明当前Shell的PATH里没有Homebrew路径。M系列芯片检查/opt/homebrew/bin是否在$PATH里echo $PATH如果输出里没有/opt/homebrew/bin说明~/.zshrc里的eval语句没生效要么没写入要么写入后没有source。重复一遍第2.3节的配置步骤基本能解决。少数情况是安装脚本实际目录不符合预期可以手动查一下ls /opt/homebrew/bin/brew有文件但PATH没指向就是纯配置问题没有文件说明安装过程有异常需要重装Homebrew。4.5 Ruby编译时的依赖报错rvm install期间常见的报错比如ERROR: libyaml is missing或者OpenSSL library not found都是编译依赖缺失。对付这个问题最快的办法rvm requirements按提示用Homebrew安装缺失库然后重新执行rvm install 3.2.2。第一次安装Ruby时建议就在终端开着日志的情况下现场装别离开太久因为中途可能要处理几次依赖。多花十分钟后面写项目会顺畅很多。4.6 常见问题速查表现象原因处理建议安装Homebrew时提示路径权限不足/usr/local目录已有其他用户写入按官方提示修目录归属别直接chmod 777brew命令找不到PATH缺少Homebrew路径在~/.zshrc里加eval配置并sourceRVM命令找不到RVM脚本未加载手动source ~/.rvm/scripts/rvm并写入配置打开新终端切不到默认Rubyrvm use ... --default没设置成功重新执行默认版本设置gem安装报权限错误用了系统Ruby或sudo切换到RVM管理的Ruby环境Ruby编译很慢源码编译需要时间确认网络稳定耐心等待不要中断5. 最后说说我现在的操作习惯Homebrew和RVM装好不是终点之后怎么维持这套环境才见功夫。我自己的几个习惯可以分享给大家。第一绝不用sudo gem install装gem一定先确认当前是RVM管理的Ruby版本不然权限问题迟早找上来。第二新项目必建独立gemset不管项目多小这一步成本极低收益却很大至少不会出现不同项目之间莫名其妙互相“毒害”依赖的情况。第三隔段时间执行一次brew update brew upgrade让基础工具保持在一个相对新的版本但升级前我会先看一眼有没有大版本变更避免工具链被突然改掉写法。还有一个建议是把环境初始化过程写成备忘录哪怕只是几行命令。因为我后来重装过几次Mac每次靠的都是当初记录下来的清单。手动从零到装完RVM半小时就能做完但要是在报错里来回折腾可能一晚上就没了。把这套组合理解成Mac开发的地基很多上层问题都不会再发生。