☰
新Mac必装:Homebrew与RVM从零安装配置完整指南
2026/10/13 19:55:05 网站建设 项目流程

新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/brew;Intel芯片则在/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 1

type 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/rvm"

3.3 安装指定Ruby版本并设置默认

RVM装好后,先看看它知道哪些Ruby版本:

rvm list known

这个列表很长,包含了各种发布版、头版、企业版Ruby。挑一个稳定的标准版来装,比如3.2.2:

rvm install 3.2.2

安装期间终端会滚动大量编译日志。第一次可能会比较久,因为要从源码编译。RVM会尽量调用之前Homebrew装好的openssl等依赖。如果编译失败,先看日志里的Error行,通常能定位到具体缺什么库。

装完以后,把当前版本设为系统默认:

rvm use 3.2.2 --default

--default的意思是,以后每次打开终端,RVM会自动加载这个版本的Ruby,不用手动去use。验证一下:

ruby -v gem -v which ruby

which 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.2@my_project --create

这句的意思是:使用Ruby 3.2.2,并创建/切换到名为my_project的gemset。之后你在这个终端里执行gem install,装的都是my_project这个集合里的gem。项目之间切换非常灵活:

rvm use 3.2.2@another_project --create

想看看当前集合装了哪些gem:

gem list

我通常把gemset名和项目名保持一致,比如项目目录叫blog,gemset就叫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 777
brew命令找不到PATH缺少Homebrew路径在~/.zshrc里加eval配置并source
RVM命令找不到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开发的地基,很多上层问题都不会再发生。

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

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

立即咨询