在 Ubuntu 中安装 RVM

2025年3月17日 | 阅读 12 分钟

RVM 支持几乎所有 Windows 和类 Unix 系统(Windows 上使用 BashCygwin,Ubuntu)。基本需求是 curl、gpg2、bash 以及整体的 GNU 版本工具,但 RVM 会尝试自动检测并安装任何必需的软件。

RVMRuby Version Manager 的缩写。它是一个为类 Unix 操作系统开发的软件平台,用于在同一设备上管理多个 Ruby 安装。整个 Ruby 环境,包括 Ruby 解释器、已安装的 RubyGems文档,将被隔离。然后,开发人员可以切换不同的版本,以处理具有不同版本要求的各种项目。

除了标准的 Ruby 解释器MRI 之外,RVM 还作为许多其他 Ruby 实现 的安装程序。这些包括 Rubinius、Maglev、IronRuby、MacRuby、mruby、jruby、Topaz、Ruby Enterprise EditionGoRuby(一个为 code golf 优化的解释器)。RVM 支持安装 MRI 修补版本

RVM 通过 “gemsets” 为 Ruby gems 的组织提供了许多功能,gemsets 是一个由命名空间和相关的 Ruby 安装 隔离的 gem 集合。Gemsets 可以通过 RVM 独有的文件,即 .rvmrc,与项目/目录关联。可以使用 .ruby-gemset 和 .ruby-version 文件(与 chruby 和 RBenv 等其他 RVM 兼容)来替代使用 .rvmrc 文件(以及基本用途,尽管是用户特定的 .jrubyrc)及其格式。使用该文件还需要信任才能防止未经授权的代码执行,而 .ruby-version 则不需要。

RVM 类型

RVM 有两种常用的类型:rbenvRVM。它们采用不同的方法来处理使用两个或多个 Ruby 版本的问题,但结果相同。我们可以在同一系统上轻松使用两个或多个 Ruby 版本。

我们应该使用哪个 RVM?

这部分取决于我们的需求和偏好,但几乎所有人都可以选择一个并开始使用它。这两个系统在功能上几乎能满足每个开发者的需求。很少有方面可以推荐一个版本优于其他版本。

如果我们使用的是 Linux 系统或 Cloud9,我们建议使用 RVM,因为它易于安装和运行。对于 Mac,RVM 也有一些问题。但是,几乎所有问题都与旧版 Ruby 有关。因此,我们可能希望在 Mac 上使用 Rbenv。如果我们已经安装了 Homebrew,安装 Rbenv 最简单的方法是使用命令,即 brew install。

RVM 的工作原理

RVM 的核心是一组目录,RVM 在其中存储每个 Ruby 版本、其相关工具(包括 irb 和 gem)以及它的 gems。所有目录都特定于提供的 Ruby 版本。如果我们需要的 Ruby 版本是 2.3.1,RVM 将使用目录 ruby-2.3.1 中的文件。如果我们需要的 Ruby 版本是 2.2.2,RVM 将从目录 ruby-2.2.2 中提取文件。

请记住,典型的 Ruby 可执行文件可以在 RVM 主目录的 Rubies 子目录中找到,而 gems 则在 gems 子目录中找到。另外,请记住,Gem 版本号在不同 Ruby 版本之间可能不同。在这种情况下,2.2.2 版本的 Ruby 使用 0.43.1 版本的 Rubocop,而 2.3.1 版本的 Ruby 使用 0.45.0 版本的 Rubocop。

  • RVM 指定了一个名为 rvm 的 shell 函数。我们的 shell 使用此函数来运行基于磁盘的命令,即 rvm
  • 使用 shell 函数还有复杂的理由,但主要原因是函数可以更改我们的环境,而基于磁盘的命令则不能。
  • 当我们执行 rvm use VERSION 来更改我们要使用的 Ruby 版本时,我们实际上是在调用 rvm 函数。
  • 它会更改我们的环境,以便多个 Ruby 命令调用正确的版本。
  • 例如, rvm use 2.2.2 会更改我们的 PATH 变量,以便命令 ruby 使用目录 ruby-2.2.2 中安装的 Ruby。
  • 它还会进行其他修改,但 PATH 修改是最明显的。
  • 如果我们想从目录 Ruby 2.2.2 执行 rubocop,我们可以告诉 RVM 使用 Ruby 2.2.2;然后执行命令 rubocop
  • 系统会在我们的 PATH 中找到 rubocop 命令,并执行它找到的第一个命令。
  • 由于 RVM 目录在我们的 PATH 中靠前,系统会检测到适用于 Ruby 2.2.2 的正确 rubocop 命令。
  • rubocop 命令位于 /usr/local/rvm/gems/ruby-2.2.2/bin 目录中。

RVM 的复杂性

RVM 是一个复杂的系统。有时,这种复杂性会影响稳定性,特别是因为它通过 shell 函数调用系统命令(如 cd)来更改它们,尽管在激活 RVM 时出现问题的可能性很小。它有许多可能出错的活动部件。可能不会出错,但可能性仍然存在。

RVM 最可能遇到的问题是我们对正在运行的 Ruby 版本感到困惑,或者我们是否使用了错误的 gem 命令来更新或安装 Gems。如果尝试检测 RVM 问题,我们首先需要确保我们使用的是正确的 Ruby 版本。这类问题更容易找到,然后我们可以分析 Gem 版本问题。

RVM 命令及解释

  • echo $PATH:此命令确认目录 {RVM PATH}/gem/rubies-{VERSION}/bin 和 {RVM PATH}/rubies-{VERSION}/bin 存在于我们的 PATH 中,并且位于可能包含同名程序的其他目录之前。
  • rvm info:此命令显示有关最新 RVM 环境的长信息列表。与 gem env 提供的内部信息相同,但格式不同,并添加了 RVM 特定的信息。
  • rvm repair all:此命令修复帮助 RVM 处理不同 Ruby 的文件。如果 RVM 似乎完全损坏,这可能很有用。
  • rvm fix-permissions:此命令可以修复 RVM 文件上的权限。如果我们意外使用 sudo 命令安装、更新或修改 RVM 或其 Gems 或 rubies,这可能很有用。
  • rvm current:它显示正在运行的 Ruby 版本。如果我们使用 gemsets,此命令会在结果中添加 gemset 名称。
  • rvm get latest:它下载并安装最新的 RVM 版本。当我们使用不熟悉或新功能,这些功能可能无法在当前版本中正常工作或可用时,这非常有用。
  • gem list:它显示最新 Ruby 所有已安装 Gem 的列表及其版本号。
  • gen env:它显示有关我们的 RubyGems 系统的配置信息。

使用 RVM 安装 Ruby 的说明

我们可以通过以下三种不同的方式安装和配置 Ruby Version Manager,如下所示并附带说明。

1. 单用户安装(推荐):在用户的 $HOME 目录中进行独立安装,不使用 sudoroot

2. 多用户安装(推荐给服务器管理员):用于系统中所有用户都可以使用的安装。此外,它以前被称为 系统范围安装。在不了解的情况下使用此类安装可能会带来重大的安全风险。

注意:单用户安装会覆盖多用户安装。

3. 混合模式安装:用于系统中所有用户都可以使用的安装,并在用户 $HOME 目录中具有独立的 gemsets/rubies。安装说明与多用户安装相同,唯一的区别是用户环境。

RVM 基础知识

RVM 不仅使安装多个 Ruby 运行时/解释器变得一致且容易,它还提供了 gemsets 等功能,而这些功能在几乎所有 Ruby 安装 中都不受支持。RVM 使我们能够以一种不会干扰现有 Ruby 安装的方式使用不同类型的 Ruby,并使我们能够在隔离的终端中同时运行多种类型的 Ruby。

社区维护项目

Ruby Version Manager社区 通过拉取请求和问题跟踪器支持和维护

  • RVM GitHub 组织 的所有项目中,
  • 特别是 RVM 项目的 问题跟踪器

生产

RVM 使我们能够使用完全专用且自包含的环境部署所有项目,从特定的 Ruby 版本,一直到运行我们应用程序所需的确定 gem 集合。拥有确定数量的 gem 可以避免项目之间的版本冲突问题,这些问题可能导致难以追踪的错误和数小时的苦恼。

开发

Ruby Version Manager 可以通过其 命令行 API 减少多个 Ruby 开发方面的复杂性。我们可以让我们的 开发、Q/A、暂存、CI生产环境 拥有自包含且一致的环境,而 RVM 可以做到这一点。不再有隐藏的差异,如果它在一个环境中实现,那么它将在每个环境中实现。

我们可以使用命名的 gemsets 立即可靠地将修改从一个环境推送到另一个环境。RVM 是为 Ruby 应用程序设计的,不仅仅是为 Rails。所有 基于 Ruby 的应用程序都将受益于我们使用 RVM。

测试

Ruby Version Manager 使我们能够非常一致且轻松地轻松测试 **迁移** 和 **升级路径**。我们可以同时针对多个 Ruby 版本运行 rake 任务、测试套件、gem 和基准测试命令,而 RVM 则可以做到这一点。这意味着我们可以轻松确保我们的应用程序在 **Ruby 1.8.X、MRI 1.9.1、REE、jruby 等版本上正常运行……并快速发现它们不正常工作的任何地方。

Gem 管理

RVM 包含一个名为 **命名 Gem Set** 的非常强大的 **Gem 管理系统**。RVM 的 **“gemsets”** 使跨多个 **Ruby 版本** 处理 gem 成为一个不是问题的问题。RVM 使我们能够将一个小的文本文件添加到我们应用程序的仓库中,而不是检入多个 gem,这会不必要地增加仓库的大小。

此外,RVM 的 gemset 管理应用了一个基本的缓存目录,因此磁盘上只有一个下载版本的 gem,而不是多个副本。RVM 支持确保所有 **Ruby** 组件完全包含在用户空间(非 root)中,强烈鼓励更安全的使用。

使用 RVM 的 Ruby 可以实现出色的系统安全性,从而降低风险并减少系统的整体停机时间。此外,由于每个进程都在用户级别执行,因此一个合成的 Ruby 进程无法合成整个系统。

开始使用 RVM

首先,我们必须确保我们已经安装了 RVM

安装后配置

当我们通过本地 shell 或 ssh 帐户登录时,RVM 将作为函数加载。如果遇到任何问题,我们可以使用以下链接之一作为参考来配置我们的终端

  • Screen 工作流
  • Zsh iTerm
  • XTerm
  • Windows 上的 Ubuntu
  • LXTerminal
  • Konsole
  • Gnome Terminal

RVM 最佳实践

以下是一组经过验证的、有助于在使用 RVM 的同时方便开发过程的最佳实践和技巧。

列表

  1. 对我们所有的个人项目使用 rvmrc 文件。
    一个 **rvmrc**(项目特定)使自动执行我们常见的 Worfklow 变得方便。它不仅使我们能够自动切换多个 Ruby 版本,还使自动引导环境变得方便。
  2. 在源代码管理中检查我们的 rvmrc。
    通过在源代码管理中将项目的 **rvmrc** 文件与我们的应用程序一起检入,我们确保每个用户在他们使用我们的项目和 RVM 时都能获得一致的环境,并且还可以自动安装 **gemset** 等。
    此外,如果我们有 $HOME/.rvmrc 文件中的 export rvm_project_rvmrc=1 命令,我们可以通过在项目目录中编码来实现任何项目的自动引导。
    最重要的是,我们还可以自动启用我们的部署,即使在使用 passenger 时,也能设置我们的应用程序特定的平台。
  3. 应用每个项目的 gemset
    在此列表中,应用 **每个项目的 gemset**,使得所有应用程序都有其不同的 gem 环境,支持我们避免版本冲突带来的问题。这包括应用类似 **"[email protected]"** 而不是 **“2.1.1”**(例如,在我们的 rvmrc 中选择 Ruby 时)。
  4. 如果可能,使用 RVM 进行设置
    使用 RVM 进行开发不仅是个好主意,如果可能,最好也用 RVM 来设置我们的应用程序。这带来了应用程序特定平台的常见好处,但也方便了在开发中追踪生产环境中出现的(版本特定的)错误。
    主要是因为它可以确保两者之间有合理一致的平台。如果需要升级 Ruby,RVM 可以通过命令 ‘rvm upgrade’ 来帮助我们。
  5. 将 RVM 集成到您选择的工具中

RVM 配置

RVM 包含一个位于 $rvm_config_path 文件的配置文件目录,对于像用户到其目录(例如 $HOME)的常见安装,它将位于 ~/.rvm/config/ 文件中。

默认设置

RVM 包含一组记录在下面提到的文件中的错误设置。

每次升级 RVM 时都会替换上述文件,所以不要编辑它。

覆盖默认设置

此外,RVM$rvm_path/user 文件中包含一个所有用户覆盖目录。我们需要将正确的 key=value 放在该文件夹的 db 文件中才能覆盖 RVM 的默认设置。

然后,RVM 将应用这些设置而不是 RVM 的默认设置。

为安装准备我们的操作系统

在安装 RVM 之前,我们需要安装 3 个库

  • GPG:这是一个用于验证应用程序源的加密程序
  • Bash:这是一个用于运行下载脚本的程序。
  • Curl:这是一个用于下载将安装 RVM 的脚本的程序。

大多数操作系统都会预装这些软件包,因此在下载之前请先检查。

使用命令行终端

在本文中,我们将引用命令行或终端。这是大多数操作系统中用于输入命令并由系统解释的应用程序的名称。MacOS 包含一个 终端模拟器Windows 包含一个 控制台Linux 也包含一个 控制台

验证安装源

RVM 会对所有版本进行加密签名,这些版本需要在下载时进行验证。通过在命令行中执行以下命令,我们将配置 RVM 需要验证签名的相关密钥

上述命令会将提供的密钥添加到我们的本地密钥存储中,并允许 RVM 安装验证,并在执行时显示以下输出

此输出表明两个重要公钥已添加到本地存储。发布时将对照这两个密钥进行检查,以验证 RVM 安装时下载的文件是否来自源。

安装 RVM

RVM 的安装过程对于 Ubuntu 操作系统与其他操作系统相比略有不同。Windows 操作系统仅在使用适用于 Linux 的 Windows 子系统时受支持,并使用与 Linux(Ubuntu 除外)和 macOS 类似的说明。

在 Ubuntu 中安装

Ubuntu 操作系统包含一个专用软件包,可以使用包管理器 apt-get 进行安装。

安装使用个人软件包档案所需的库

我们需要安装 software-properties-common Ubuntu软件包,以允许添加 个人软件包档案(或 PPA)。

我们需要打开我们的命令行窗口并执行以下命令


Install RVM Ubuntu

Install RVM Ubuntu

上述命令将使用当前引用更新包管理器 apt-get,然后安装允许添加 RVM PPA 的库 software-properties-common

我们需要执行以下命令来验证之前的命令是否成功运行


Install RVM Ubuntu

上述命令将查询包管理器以验证提供的包是否已正确安装。如果此命令成功运行,我们的命令行窗口将显示以下消息。

添加 RVM 的 PPA

使用以下命令,具体添加 RVM 的 个人软件包档案。此命令将添加一个包含 RVM 二进制文件的存储库并允许安装


Install RVM Ubuntu

上述命令将存储库添加到 Ubuntu 的内部列表中。这对于启用 RVM 安装是必不可少的。

安装 RVM

我们需要更新我们的安装程序,然后通过在终端中执行以下命令来安装 RVM


Install RVM Ubuntu

此命令将安装 RVM 应用程序,并为应用程序提供正确的权限。-y 选项将跳过安装时的确认请求。

使用 RVM 验证安装是否正确

我们将执行以下命令在终端中首次启动 RVM。安装过程完成后,只需执行一次即可

上述命令将运行脚本,并允许我们在终端的最新终端中执行 RBM。我们需要指示 RVM 返回当前安装的版本,以确保我们的 RVM 正确工作,方法是在终端中执行以下命令


Install RVM Ubuntu

上述命令将显示我们操作系统上安装的最新 RVM 版本。

安装 Ruby

我们将使用 “rvm install <version-number>” 命令来使用 RVM 安装 Ruby 版本。我们需要在终端中执行以下命令来安装特定版本的 Ruby


Install RVM Ubuntu

该命令可能会编译 Ruby 的二进制文件,或从源应用预编译的二进制文件,具体取决于我们的操作系统。如果使用源进行编译,可能需要一些时间才能完成。

我们将执行以下命令在终端中检查此安装是否已正确实现


Install RVM Ubuntu

它将列出 RVM 处理的所有已安装 Ruby 版本。