HOWTO · Ruby

在 Mac 上更改 Ruby 版本

我们将演示如何在 Mac 上更改 Ruby 版本。

本页内容

在 Mac 上切换 Ruby 版本,可以使用 rbenv 或 RVM 等版本管理器。你可以为单个项目选择本地版本,也可以为 shell 设置全局默认版本。Bundler 可以检查项目是否使用其声明的 Ruby 版本,但它不会安装 Ruby 或切换版本。下面分别介绍这两种管理器;选择其中一种后,请确认 shell 实际使用了所选版本。

为 Mac 选择 Ruby 版本管理器

如果你想用轻量工具通过 shell 的 PATH 选择 Ruby,并让工具读取项目的 .ruby-version 文件,可以选择 rbenv。如果你还需要 Ruby gemset 和更全面的环境管理功能,可以选择 RVM。避免同时配置两者去修改相同的 shell 启动文件:相互冲突的 PATH 设置会让当前使用的版本难以排查。

macOS 上的安装情况各不相同,更改前先运行 ruby -v 检查当前可用的版本。不要假设每台 Mac 都预装了 Ruby,也不要假设某个包管理器一定会提供特定的“最新”版本。版本管理器会安装你指定的版本;系统中安装的编译器和系统库可能会影响较旧版本能否成功编译。

使用 rbenv 安装和切换 Ruby 版本

如果尚未安装 Homebrew,请先安装。然后运行 brew install rbenv 安装 rbenv。在当前的 Homebrew 配置中,运行 rbenv init 可在 shell 中初始化 rbenv;按照命令针对你所用 shell 给出的说明操作,然后重启终端或重新载入启动文件。较早版本的 rbenv 配置说明可能要求添加特定于 shell 的初始化语句,请按照你所安装版本的说明进行设置。

运行 rbenv install 3.2.2 安装 Ruby 版本(请将示例版本替换为项目所需的版本)。如果无法使用 rbenv install 命令,请按照当前 rbenv 安装方式推荐的方法安装 ruby-build 组件,然后重试。

选择版本的适用范围:

  • 在项目目录中运行 rbenv local 3.2.2。该命令会将 3.2.2 写入该目录的 .ruby-version 文件,因此 rbenv 会在该目录及其子目录中选择这个版本。
  • 如果想将某个版本设为全局默认版本(仅在目录没有本地设置时生效),请运行 rbenv global 3.2.2。

本地设置优先于全局设置。运行 rbenv version 检查所选版本,然后通过 ruby -v 和 which ruby 确认 shell 找到的是预期的解释器。如果 ruby 仍指向其他位置,请确保在你实际使用的 shell 中初始化了 rbenv,并检查 $(rbenv root)/shims 是否排在 PATH 中其他 Ruby 路径之前。

使用 RVM 安装和切换 Ruby 版本

RVM 使用远程安装程序。运行安装程序前,请先阅读 RVM 项目的安装说明;将下载的脚本直接通过管道传给 shell 会执行来自网络的代码。按照 shell 对应的说明安装 RVM 后,打开新的终端,或载入它的 shell 集成配置。对于已安装的 RVM,可以在当前会话中运行 source ~/.rvm/scripts/rvm 来载入它。

运行 rvm install 3.2.2 安装项目需要的 Ruby 版本,然后运行 rvm use 3.2.2 选择该版本。若要将其设为新 shell 的默认版本,请运行 rvm use 3.2.2 --default。在项目目录中运行 rvm use 3.2.2 会为当前 shell 选择该版本;配置好 shell 集成后,RVM 也支持项目文件。

运行 ruby -v 和 which ruby 验证结果。如果旧版本仍处于活动状态,请确认 RVM 已在当前 shell 中载入,并检查 PATH 中是否有其他 Ruby 管理器或系统 Ruby 排在前面。RVM 和 rbenv 是不同的工具;某个工具的命令不会配置另一个工具。

使用 Bundler 声明项目所需的 Ruby 版本

项目可以在 Gemfile 中声明所需的 Ruby 版本:

ruby "3.2.2"

请使用项目支持的版本,然后在已选择该 Ruby 版本的环境中运行 bundle install。Bundler 会将当前解释器与 Gemfile 中的版本要求进行比对,并安装项目所需的 gem;它不会下载或切换 Ruby。如果当前 Ruby 不符合要求,请使用 rbenv 或 RVM 选择或安装兼容版本,然后重新运行 Bundler。

将 .ruby-version 文件提交到项目中,可以帮助版本管理器自动选择项目所需的 Ruby 版本。请确保该文件中的版本与 Gemfile 的要求一致,并确保每位开发者及构建环境都已安装所需版本。

验证当前 Ruby 版本并解决常见问题

请在运行应用程序所用的同一个终端和目录中执行以下命令:

  • ruby -v 会显示 shell 正在运行的解释器版本。
  • which ruby 会显示在 PATH 中最先找到的可执行文件。
  • 使用 rbenv 时,rbenv version 会报告所选版本及其来源。
  • 使用 RVM 时,rvm current 会报告当前活动版本。

下面的 Ruby 示例会打印运行它的解释器所报告的版本。提供的运行记录中,输出标签 Active Ruby 保持英文,示例显示的输出为:

puts "Active Ruby: #{RUBY_VERSION}"
Active Ruby: 3.1.2

如果管理器报告了预期版本,但 ruby -v 显示的不是该版本,shell 很可能解析到了另一个可执行文件。请检查当前 shell 使用的启动文件中是否包含管理器的初始化设置,打开新的终端,然后再次检查 PATH。也请检查当前目录中是否有 .ruby-version 文件,因为它可能覆盖 rbenv 的全局设置。如果 Bundler 报告 Ruby 版本要求不匹配,请对照 Gemfile 中的版本要求与 ruby -v 的结果;单独更改 gem 无法解决 Ruby 解释器版本不匹配的问题。

常见问题

可以安装多个 Ruby 版本吗?

可以。rbenv 和 RVM 都能保留多个已安装的 Ruby 版本。你可以为整个 shell 或特定项目选择合适的版本,不必删除其他项目可能仍在使用的版本。

如何只为一个项目使用不同的 Ruby 版本?

使用 rbenv 时,在项目目录中运行 rbenv local VERSION;该命令会将所选版本记录在 .ruby-version 文件中。使用 RVM 时,在项目 shell 中运行 rvm use VERSION;如果想在进入目录时自动切换版本,还可以配置 RVM 的项目文件支持。无论使用哪种工具,都要确保所需版本已经安装,并通过 ruby -v 验证。

需要卸载之前的 Ruby 版本吗?

不需要。其他项目仍需使用的版本可以保留。如果之后要删除某个版本,请使用安装它的版本管理器提供的卸载命令,并先确认没有项目依赖它。

Bundler 会切换当前 Ruby 版本吗?

不会。Gemfile 中的 ruby 声明让 Bundler 检查当前解释器是否符合项目要求。请使用版本管理器安装并选择 Ruby,然后运行 bundle install。