RVM 入门指南:Ruby 版本与 Gemset 环境管理
RVM 是功能最全的 Ruby 环境管理器,除版本切换外还提供 gemset 依赖隔离。本文讲解 RVM 安装、工作原理、gemset 用法、项目自动切换与 Bundler 协作。
RVM(Ruby Version Manager)通过 Shell 函数接管 cd 行为,实现按项目自动切换 Ruby 版本,并独有 gemset 机制——在同一 Ruby 版本下再隔离出多套 gem 环境。它功能最强但对 Shell 侵入也最深,追求轻量可选 rbenv/Mise,需要细粒度环境隔离选 RVM。
RVM 与 rbenv 的本质区别
rbenv 用 shim 垫片被动转发命令;RVM 则直接改写 Shell:安装时向 .bashrc/.zshrc 注入函数,重定义 cd 命令——进入目录即检测 .ruby-version 和 .ruby-gemset 文件,自动切换环境。这种"主动式"设计换来流畅体验,代价是对 Shell 环境侵入较深(这是它的主要争议点)。
安装 RVM
\curl -sSL https://get.rvm.io | bash -s stable
source ~/.rvm/scripts/rvm
rvm --version
安装脚本会自动处理编译依赖(openssl、readline 等),这是 RVM 比 rbenv 省心的地方之一。
版本管理
rvm list known # 查看可安装版本
rvm install 3.3.0 # 安装
rvm list # 已装版本
rvm use 3.3.0 # 切换
rvm use 3.3.0 --default # 设为默认
rvm remove 3.1.4 # 删除
gemset:RVM 的独门武器
同一 Ruby 版本下,不同项目的 gem 仍可能冲突(Rails 7.0 项目与 7.1 项目共存于 Ruby 3.2)。gemset 在版本之下再切一层隔离:
rvm use 3.3.0
rvm gemset create blog-api shop-api
rvm use 3.3.0@blog-api # 指定版本+gemset
rvm gemset list # 查看
rvm gemset empty blog-api # 清空重建
每个 gemset 有独立的 gem 目录,互不污染。
项目自动环境
在项目根目录创建两个文件:
echo '3.3.0' > .ruby-version
echo 'blog-api' > .ruby-gemset
首次 cd 进入时 RVM 提示信任该配置,之后进入目录自动切换到 3.3.0@blog-api——团队每人克隆仓库即得正确环境,这是 RVM 体验最顺滑的一环。
与 Bundler 的分工
gemset 管"环境隔离",Bundler 管"版本锁定"。现代实践中两者可以只取其一:新项目推荐 Bundler 优先——Gemfile.lock 已能精确锁定依赖树,全局一个 default gemset + bundle install 即可覆盖多数场景;gemset 留给"同一机器跑多个无法统一依赖的老项目"这类硬隔离需求。
常见问题(FAQ)
Q:RVM、rbenv、Mise 2026 年怎么选?
需要 gemset 级隔离或维护多个遗留项目选 RVM;喜欢极简、只用 Ruby 选 rbenv;多语言混合技术栈选 Mise(asdf 现代替代)。三者都能配合 Bundler,切换成本不高。
Q:终端里 rvm 命令找不到?
RVM 是 Shell 函数而非可执行文件:确认 .zshrc/.bashrc 末尾有 source ~/.rvm/scripts/rvm,且终端以 login shell 方式启动(部分终端模拟器需单独勾选)。
Q:卸载 RVM 要注意什么?
rvm implode 删除全部内容后,还要手动清理 Shell 配置文件里注入的加载行,否则新终端会持续报 source 失败。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。