拿到一台新Mac第一件事不是急着装各种IDE而是先把命令行工具链理清楚。macOS虽然自带Git、Ruby这类基础组件但版本偏旧、路径分散、系统保护严密真正能支撑日常开发的完整环境基本都要靠包管理器和版本管理器打底而这一套组合里最常用的就是Homebrew和RVM。这篇文章把我从零到一装环境、配镜像、排障踩坑的整个流程完整写一遍给准备在Mac上做Ruby开发或需要管理多版本Ruby的读者一份可以直接照着操作的清单。整个过程不涉及复杂的编译原理只要跟着步骤走、理解每一步为什么这样做就能在一台新机器上搭出可用的开发环境。1. mac开发环境的地基为什么是Homebrew和RVM1.1 Homebrew解决的核心问题很多刚从Windows切到Mac的开发者第一反应是下载软件不是拖到Applications就行吗但命令行工具完全走的是另一套逻辑。你可能会需要用某个命令行程序比如ffmpeg、wget、tree这些程序往往依赖一堆动态库手动去官网下载二进制包再配置路径一次两次还能忍装到第十个工具的时候基本就乱了版本冲突、依赖缺失、不知道老版本残骸藏在哪个目录。Homebrew的思路很像手机上的应用商店统一维护软件列表自动解决依赖关系指定目录安装卸载时也能把关联文件清干净。它默认装到/opt/homebrew或/usr/local目录下不会污染系统自带的/usr/bin目录这本身就是一种安全设计。当你需要某个开发库时不再需要翻官网、找下载地址、手动处理动态库依赖一条brew install命令就能把整个依赖链条都拉下来这对后面安装Ruby编译环境非常有帮助。1.2 RVM为什么被反复提及macOS系统会自带一个Ruby版本但那个版本是给系统组件用的不是给开发者随便改的。系统Ruby所在目录受系统保护机制限制你直接执行sudo gem install某个gem经常会碰到权限报错更麻烦的是不同项目对Ruby版本的要求不一样一个项目要2.7另一个要3.2系统里只有一个固定版本根本没法切换。RVM在这个场景下就是Ruby版本管理器。它把所有Ruby版本都装在你的用户目录下每套版本带独立的gem环境切换版本就像换衣服一样简单不用动系统自带的东西。相比rbenv和asdfRVM在macOS上对新手更友好安装和切换的概念也直观安装Ruby时还会顺手帮你处理一些编译参数所以我这篇文章以它为主。如果你后面用熟了想换别的工具概念上也是互通的。1.3 两个工具为什么会放在一起说个实际现象装完Homebrew默认会带出编译器工具链而RVM编译新Ruby时需要openssl、readline、libyaml这些依赖用Homebrew装这些库恰好是顺手的事。反过来RVM帮你管好Ruby环境后很多Ruby命令行工具比如一些静态站点生成器又能通过同一套环境直接使用Homebrew安装的依赖。两者各管一层配合起来正好覆盖了从系统基础工具到语言运行环境的整条链路。我见过不少教程只讲安装命令不讲这两者的分工结果读者装完也不知道每个工具在系统里扮演什么角色出了问题更加不知道查哪里。所以后面每一部分我都会先交代一句为什么这一步要这么做再上操作。2. 安装Homebrew前的环境检查与准备工作2.1 先确认你的Mac是哪种芯片Homebrew在Apple Silicon和Intel处理器上的安装路径、默认前缀完全不同搞清楚这个能避免大量后续烦恼。旧款Intel Mac会把Homebrew装到/usr/local目录Apple SiliconM1、M2、M3都算则装在/opt/homebrew目录。检查方式很简单打开终端输入一行命令uname -m输出arm64就是Apple Silicon输出x86_64就是Intel架构。这个信息在后面配置PATH时会直接用到千万别跳过。用Apple Silicon芯片的机器即便通过Rosetta跑Intel版工具Homebrew的安装路径也依然遵循实际芯片架构不要凭感觉乱猜。芯片类型终端输出Homebrew默认前缀Apple Siliconarm64/opt/homebrewIntelx86_64/usr/local2.2 安装Command Line ToolsHomebrew安装过程中需要用到编译器、git、make等基础命令这些来自Xcode Command Line Tools。你可能装了Xcode但命令行工具并不一定齐全。先执行xcode-select --install系统会弹窗询问是否安装确认后等待完成即可。如果提示already installed通常说明已经有了如果之后编译时还是报缺少编译器可以在系统设置开发者工具里查看状态必要时卸载重装一次。安装完成后可以用xcode-select -p验证路径正常情况下会输出一个类似于/Applications/Xcode.app/Contents/Developer的目录。这套工具链是所有编译操作的基础缺失的话后面RVM编译Ruby连第一步都走不过去。2.3 终端环境和网络状况的基础确认安装过程大多在终端里完成建议先把终端调成习惯的样子至少要知道自己的默认shell是zsh还是bash绝大多数新版macOS默认是zsh。你还要注意自己平时打开的终端是普通窗口还是登录shell模式这会影响后续配置文件的加载方式。很多人在这一步栽过跟头后面第6章我会专门讲。网络方面Homebrew官方仓库托管在GitHub受网络环境影响直接从官方仓库拉取的速度可能不太理想。对于这类情况一个通用做法是使用国内的开源镜像站替换下载源。镜像站本身是公开服务去对应页面找到Homebrew分类把给出的环境变量和安装命令保存下来后面第3章会用。在此之前你还可以顺手确认一下系统时间是否正确时间不同步会导致证书校验失败这类报错经常被误判成网络问题。3. Homebrew完整安装官方脚本、镜像源与PATH配置3.1 官方安装脚本的基本用法Homebrew官方提供了一键安装脚本最直白的用法是/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)这条命令会下载一个安装脚本并立即执行。脚本做的事情包括确认系统版本、安装缺失的Command Line Tools、创建目录、复制Homebrew相关文件。过程中会提示输入sudo密码因为Homebrew需要往/opt/homebrew或者/usr/local里写入目录。输入密码时终端不会显示任何字符属于正常现象。这个脚本是全自动的但如果你所在的网络环境访问GitHub不稳定脚本可能会在中途卡住或者从第一行就下载不下来。这时候就得走镜像源方案。我第一次装Homebrew时也遇到过脚本执行到一半卡住最后取消又执行了一遍才意识到是下载源问题从此养成了习惯先看下载来源再决定用哪套命令。3.2 国内用户替换镜像源的完整流程镜像源的本质就是把GitHub上Homebrew仓库的完整副本同步到国内服务器你再从这些服务器下载。很多高校和开源社区都提供这类镜像而且都会维护Homebrew官方的安装脚本镜像。以某高校镜像站的通用安装方式为例实际使用时请直接到该镜像站首页查找最新说明export HOMEBREW_BREW_GIT_REMOTEhttps://mirrors.example.edu.cn/git/brew.git export HOMEBREW_CORE_GIT_REMOTEhttps://mirrors.example.edu.cn/git/homebrew-core.git export HOMEBREW_BOTTLE_DOMAINhttps://mirrors.example.edu.cn/homebrew-bottles /bin/bash -c $(curl -fsSL https://mirrors.example.edu.cn/install.sh)重点解释三个变量HOMEBREW_BREW_GIT_REMOTE替换Homebrew主仓库地址对应的是brew命令自身的源码。HOMEBREW_CORE_GIT_REMOTE替换Homebrew的核心软件包仓库安装大多数命令行工具时都从这里取数据。HOMEBREW_BOTTLE_DOMAIN替换预编译二进制的下载域名bottle相当于预编译好的软件包不用本地编译速度提升非常明显。不同镜像站维护的安装方式略有差异有的支持直接下载脚本文件再执行有的要求先配好环境变量再运行。我自己的习惯是先去镜像站首页找到Homebrew分类直接复制它给出的命令要比网上转来转去的旧教程可靠得多。尤其注意镜像站偶尔会更新服务器路径旧教程里的地址很可能早就不适用了。3.3 安装完成后的配置PATH与shell启动文件无论哪种方式安装Homebrew装完都不会自动进入终端的命令搜索路径需要在shell的启动文件里加入一行。Apple Silicon机器添加这行到~/.zshrcexport PATH/opt/homebrew/bin:$PATHIntel机器则是export PATH/usr/local/bin:$PATH写完后执行source ~/.zshrc让配置立即生效然后运行brew --version验证。如果返回版本号说明基本装好了。新版Homebrew还支持更规范的写法eval $(/opt/homebrew/bin/brew shellenv)这种写法会把前缀、仓库目录、PATH等一整套环境变量都配置好比手动加PATH更完整。我个人建议直接采用这种写法一劳永逸。另外提醒一句~/.zshrc是zsh的启动文件如果你把配置写进了.bash_profile在默认zsh下不一定会加载很多装完找不到命令的案例都源于这类配置文件放错位置的问题。提示改完配置文件后先执行source ~/.zshrc再开一个新的终端窗口测试。如果新窗口里brew命令可用说明配置已经生效不用反复怀疑环境变量没写对。3.4 安装完成后的自检流程装好之后执行brew doctor检查整个安装是否健康。它会检查目录权限、symlink状态、可疑配置等并给出提示。第一次运行时出现一些Warning很常见比如Unbrewed header files found之类不用慌张逐一阅读提示按建议处理即可。另一个自检命令是brew config可以查看当前prefix、HOMEBREW_*环境变量、Git Remote等关键信息排查问题时非常有用。我自己每次在新机器装完Homebrew一定会执行一遍brew doctor和brew config并顺手把输出保存下来。这样做的好处是后面一旦出问题能对比安装刚完成时的状态和出问题时的状态定位异常配置会快很多。如果你看到brew doctor提示的问题属于unbrewed dependencies或unbrewed header files多半是机器里残留了其他渠道装的软件不影响核心功能可以先放着不处理。4. Homebrew真正高价值的日常操作习惯4.1 formula和cask两种装法要分清用Homebrew装软件时经常看到两种说法formula和cask。formula是命令行工具和开发库比如brew install autoconfcask是带图形界面的应用软件比如brew install --cask some-app。一个简单的区分方式需要打开图形窗口运行的软件大多是cask在终端里敲命令运行的软件基本是formula。实际场景里很多人习惯用cask统一管理图形软件省去手动下载dmg、挂载镜像、拖入Applications的重复劳作升级也方便。但要注意cask默认会把应用装到/Applications目录有些软件需要额外授权安装过程会弹窗属于正常现象。如果你在安装某个cask时提示must be run as administrator把命令前面加上sudo再试一次但前提是你确实清楚这个软件包来源可靠。类型适用对象示例命令formula命令行工具、开发库brew install gitcask图形界面应用brew install --cask firefox4.2 更新、升级与清理Homebrew自身和它管理的软件包是要分开升级的。日常操作顺序一般是brew update brew outdated brew upgrade brew cleanupbrew update负责更新Homebrew自身的仓库信息brew outdated列出有哪些软件可以升级brew upgrade执行升级brew cleanup清理旧版本残留。这套流程不用跑太频繁每隔一两周做一次就行。注意别看到brew upgrade建议就无脑升有些开源软件的新版本可能带破坏性变更如果当前版本工作正常可以先跳过。作为一个开发环境稳定可用永远比尝鲜重要。4.3 遇到问题时的通用排查思路Homebrew本身的报错信息写得已经比较直白但新手容易慌。我一般按这样的顺序排查先看错误信息最后几行确认是网络问题、依赖问题还是权限问题。网络问题确认镜像源配置是否生效用brew config检查HOMEBREW_BOTTLE_DOMAIN等变量或重新设置。依赖问题根据报错提示输入brew install缺失的依赖。权限问题检查目录拥有者不正常时用sudo chown修正到当前用户。这套思路看起来简单但能覆盖我遇到的绝大多数Homebrew相关问题。尤其要养成先看最后20行日志的习惯而不是被长长的报错信息吓到。报错信息末尾通常会直接指出需要安装哪个包、哪个路径不存在照着处理就好。4.4 什么情况下需要卸载重装如果你折腾坏了Homebrew配置、镜像源被改得乱七八糟或者升级系统后出现奇怪故障直接卸了重装往往比排查更省时间。官方卸载脚本如下/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)卸载会删除Homebrew管理的软件和目录重装后镜像源配置需要重新设置所以建议卸载前先记录自己当前使用的变量配置方便装完立刻恢复。我个人还会顺手把本地brew list的输出保存一份这样重装以后能快速知道以前装过哪些常用软件一条一条install回来就好。5. RVM安装与Ruby多版本管理实操5.1 为什么不建议去改系统自带RubymacOS系统里自带的那个Ruby是为系统自身服务准备的。它所在的位置在系统保护机制允许的范围内你可以读它但不应该写它。在系统Ruby上直接执行gem install经常得到permission denied一类的报错即便用sudo绕过权限也可能在系统升级后被覆盖或失效。多项目场景下的版本冲突更是无解。RVM的做法完全不同它把用户目录作为独立空间所有Ruby版本和gem都保留在~/.rvm下不影响任何系统文件权限问题基本消失版本随意切换。可以说系统自带的Ruby不是给你干活用的而是告诉你系统里预装了Ruby真正干活的那个Ruby应该由版本管理器接管。5.2 先用Homebrew补齐编译依赖RVM在macOS上安装Ruby时如果没有现成的预编译二进制就会走本地编译流程。Ruby的编译依赖包括openssl、readline、libyaml、autoconf等直接通过Homebrew装好brew install openssl readline libyaml autoconf pkg-config sqlite这里重点提一下openssl。RVM安装较老版本的Ruby时会去找系统openssl但新版macOS自带的openssl版本或路径可能对不上加上系统库的版本策略越来越严格这一步经常出问题。用Homebrew安装完openssl后可以记录一下它安装的位置后面安装Ruby时通过参数指定。这个位置可以用brew --prefix openssl拿到后面5.4节会用到。5.3 安装RVM的完整步骤官方推荐的安装命令是curl -sSL https://get.rvm.io | bash -s stable如果网络状况不理想建议先下载脚本再执行避免管道方式下载中断导致半途失败curl -sSL https://get.rvm.io -o rvm-installer bash rvm-installer stable安装完成后终端会提示需要source相关脚本。执行source ~/.rvm/scripts/rvm type rvm | head -1如果输出rvm is a function说明RVM已经作为shell函数加载成功。注意不要把这里的source命令漏掉很多人的RVM安装在重启终端后又失效了原因就是没有让脚本在每次登录时自动加载安装输出里一般会提示是否需要自动加入shell配置选yes即可。如果你用的是zsh也可以手动在~/.zshrc里加上source ~/.rvm/scripts/rvm这一行保险起见。5.4 用RVM安装指定版本Ruby先看看有哪些版本可选rvm list known然后安装一个具体版本比如3.2.2rvm install 3.2.2 --with-openssl-dir$(brew --prefix openssl)这里的关键点就是--with-openssl-dir。如果你遇到类似openssl is not available的编译错误多半是这个参数没设置或路径不对。安装耗时看机器性能通常几分钟到十几分钟期间终端会输出大量编译日志只要最后没有error字样基本可以往下走。切换到刚装好的版本并设为默认rvm use 3.2.2 --default ruby -v输出应该显示ruby 3.2.2相关字样。设为默认后每次打开新的终端窗口都会直接使用这个版本不需要重复切换。市面上还有一种常见场景是项目要求使用2.x版本的Ruby这类老版本在新系统上编译容易遇到额外兼容问题。遇到这种情况我的建议是优先看项目是否有现成的.ruby-version文件或者直接在RVM里安装相应的老版本编译失败时再根据错误日志补依赖不要因为一次失败就放弃老版本项目很多老项目只需要多装一个编译库就能顺利跑起来。5.5 gemset独立沙盒比想象中有用RVM除了切换Ruby版本还支持在同一版本下创建多个独立的gem集合叫gemset。实际开发时项目A可能依赖rails 7项目B可能依赖rails 6即使Ruby版本相同gem集合也不能共用。用gemset可以这样rvm use 3.2.2project_a --create这会切换到名为project_a的独立gem空间在该空间内安装的任何gem都不会影响其他gemset。配合Bundler使用本质上就是一套清晰的隔离方案。切换gemset和切换版本同样就在一行命令之间用熟了会非常顺手。如果你同时维护两三个项目又不想经常删了装、装了删gemset值得长期坚持使用。6. 一套完整的初始化清单与踩坑记录6.1 新Mac从零到能跑项目的完整顺序把前面所有内容串成一个固定顺序这就是我给自己整理的标准流程确认芯片架构uname -m准备好对应路径。安装Command Line Toolsxcode-select --install。配置镜像源环境变量执行Homebrew安装脚本。设置PATH、执行brew doctor自检。用Homebrew安装RVM编译依赖。安装RVMsource加载脚本。rvm list known查看版本安装目标Ruby版本。rvm use设置默认版本创建项目gemset。进入项目目录安装项目依赖开始开发。这套顺序里Homebrew在RVM之前安装是有讲究的。因为RVM编译Ruby时要用Homebrew提供的新版openssl和readline如果先装RVM再补依赖出现编译错误时排查链路更复杂。顺着这个顺序走基本能做到一气呵成。6.2 我实际遇到的几个典型故障先说我遇到最多的装完Homebrew后在终端输入brew却提示command not found。这个问题的原因几乎都是PATH没有配置好。新版macOS的默认shell是zsh但很多人习惯去改.bash_profile或者.bashrc完全没生效。解决办法是把配置写到~/.zshrc然后执行source ~/.zshrc。第二个是安装了RVM却提示rvm: command not found。和上一个问题类似通常是RVM脚本没有被shell自动加载。确认~/.rvm/scripts/rvm文件存在之后在~/.zshrc里加一行source命令重启终端即可。第三个是编译Ruby时openssl相关报错。这类报错信息通常很长但结尾往往能看见openssl关键词。执行brew --prefix openssl得到具体的openssl安装路径再通过--with-openssl-dir参数传给RVM重新编译往往就能通过。第四个是镜像源失效。镜像站偶尔会更新目录结构或调整协议导致HOMEBREW_BOTTLE_DOMAIN指向的地址失效。判断方法是执行brew config看当前实际配置然后到镜像站首页确认最新地址重新设置即可。6.3 通用排障思路别一上来就重装遇到安装失败最忌讳的是不看日志直接重装一遍。我推荐的方法是记录完整报错信息重点看最后20行。判断报错属于网络、依赖、编译还是权限中的哪一类。网络问题查镜像和DNS依赖问题看是否缺少某个库编译问题搜错误关键词权限问题检查目录拥有者。例如如果你执行brew install时卡在Downloading过程多半是下载源的问题优先检查镜像源配置如果编译时出现clang: error: no such file or directory优先检查Command Line Tools是否完整。这套方法几乎适用于所有命令行工具不只是Homebrew和RVM。我自己的经验是八成以上的安装失败在初次排查时就能定位真正需要反复折腾的场景其实很少。报错类型典型现象优先排查方向网络问题Downloading阶段卡住、连接超时镜像源配置、DNS依赖问题提示缺少某库文件用brew安装对应依赖编译问题clang、make报错Command Line Tools、openssl路径权限问题Permission denied目录拥有者、sudo授权配置问题command not foundPATH、shell配置文件位置6.4 一些长期使用的经验最后多说几句我的切身体会。作为新手最不需要做的就是把所有软件全家桶一次性装进开发环境工具链越简洁出问题的概率越低先只装项目必需的依赖等项目推进之后再按需添加排查问题时压力小得多。镜像源配置属于硬需求既然要长期在Mac上做开发建议把镜像地址整理到自己的笔记里换电脑、换硬盘时能直接照着恢复。而RVM和Homebrew每月更新一两次就够了保持可用状态比盲目追新重要。说实话Homebrew和RVM的安装本身并不难网上教程一抓一大把但真正卡住人的往往是一些细节路径没配好、镜像源失效、编译依赖缺失、shell文件搞错。把这些问题在第一次安装时就理解透彻后续所有开发工作都会顺畅很多。整套流程跑过两三遍以后你会发现自己不再需要照着教程敲命令了因为每个环节为什么存在、出了问题该查哪里心里都已经有数了。