RVM
RVM (Ruby enVironment Manager) 是一个命令行工具,可以让我们轻松地安装、管理和使用多个 Ruby 环境,从解释器到 gem 集合。
存在一个类似的应用,您可能也想考虑:rbenv。
安装
安装过程非常简单。您有两种选择,一种是系统范围的,另一种是用户级别的。第一种适用于生产服务器,或者如果您是机器上的唯一用户,则需要 root 权限。第二种推荐用于同一机器上的多个用户(例如开发测试环境)。如果您不知道选择哪种,请从单用户安装开始。
上游 RVM 安装说明应该可以直接使用。安装脚本能够识别出您需要在 Arch Linux 上安装哪些软件包才能使不同的 Ruby 版本工作。这通常涉及到 gcc 和一些编译 Ruby 所需的其他东西。
作为一项观察,不再推荐使用 gem 安装 RVM。本文档使用推荐的文档,并进行了一些小的调整以使其在 Arch Linux 上工作。
先决条件
在开始之前,您需要安装以下软件包 base-devel, tar, gzip, diffutils, git 和 curl,如果尚未安装。
单用户安装
~/.rvm
),并且不会触及标准的 Arch Ruby 软件包,它位于 /usr
中。对于大多数用途,推荐的安装方法是单用户安装,这是一种自包含的 RVM 安装,位于用户的主目录中。
使用 rvm 文档推荐的脚本进行安装。确保以您希望安装 RVM 的用户身份运行此脚本(即您用于开发的普通用户)。
要在运行脚本之前检查它,请执行
$ curl -L get.rvm.io > rvm-install
检查文件,然后使用以下命令运行它
$ bash < ./rvm-install
现在,关闭您当前的 shell 或终端会话,并打开一个新的会话来设置您的 PATH 和 rvm 函数。您可以尝试使用以下命令重新加载您的 ~/.bash_profile
$ source ~/.bash_profile
但是,关闭您当前的 shell 或终端并打开一个新的会话是初始安装的首选方法。
多用户安装
/usr/local/rvm
,并且不会触及标准的 Arch Ruby 软件包,它位于 /usr
中。系统范围的安装与单用户安装类似。但是,请使用 sudo 运行安装脚本。不要直接以 root 用户身份运行安装程序!
$ sudo bash -s stable
(要安装特定版本,请将 stable 替换为,例如,-- --version 1.13.0)
脚本完成后,将您自己和您的用户添加到 'rvm' 组。(安装程序不会自动将任何用户添加到 rvm 组。管理员必须执行此操作。)对于每个人,重复
# usermod -a -G rvm <user>
组 membership 仅在登录时评估。注销用户,然后重新登录。您也一样:关闭您当前的 shell 或终端会话,并打开一个新的会话。您可以尝试使用以下命令重新加载您的 ~/.bash_profile
$ source ~/.bash_profile
但是,关闭您当前的 shell 或终端并打开一个新的会话是初始安装的首选方法。或者,您可以使用 newgrp rvm
命令,并使用 id
检查 shell 是否已获取用户的新的组 membership
[[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm
行更改为系统范围的位置,将 $HOME
更改为 /usr/local/
RVM 将为系统上的每个用户自动配置(与单用户安装相反);这是通过在登录时加载 /etc/profile.d/rvm.sh
完成的。Arch Linux 默认解析 /etc/profile
,其中包含加载 /etc/profile.d/
目录中所有文件的逻辑。
在使用多用户 rvm 安装 gems 之前,请确保 /etc/gemrc
没有 gem: --user-install
行。如果存在,您需要注释掉它,否则 gems 将安装到错误的位置。
仅在安装过程中使用 sudo 命令。在多用户配置中,任何需要 sudo 访问权限的操作都必须使用 rvmsudo 命令,该命令会保留 RVM 环境并将其传递给 sudo。核心安装完成后,只有极少数情况下需要 rvmsudo,除非是更新 RVM 本身。安装后绝不需要使用 sudo。rvmsudo 仅在更新时需要
$ rvmsudo rvm get head
一项警示操作
为了防止由此原因导致的安装中断,您可以将此配置添加到您的 /etc/sudoers
文件中,命令为:su -c visudo
(以 root 用户身份运行)
## Cmnd alias specification Cmnd_Alias RVM = /usr/local/rvm/rubies/ruby_interpreter/bin/gem, \ /usr/local/rvm/rubies/another_ruby_interpreter/bin/gem, \ /usr/local/rvm/bin/rvm ## User privilege specification root ALL=(ALL) ALL ## Uncomment to allow members of group wheel to execute any command %wheel ALL=(ALL) ALL, !RVM
其中 ruby_interpreter
将是 — 例如 — ruby-1.9.2-p290。
安装后配置
安装后,使用此命令检查一切是否正常工作
$ type rvm | head -n1
响应应为
$ rvm is a function
如果您收到 rvm: 未找到,您可能需要 source 您的 ~/.bash_profile
(或您将上述行放置的位置)
$ . ~/.bash_profile
如果您收到 "rvm is hashed",您需要在 ~/.bashrc
或类似文件中 source ~/.rvm/scripts/rvm
$ source $HOME/.rvm/scripts/rvm
检查 rvm 函数是否正常工作
$ rvm notes
最后,通过运行以下命令查看您的安装是否有任何依赖项要求
$ rvm requirements
(如果返回任何说明,请按照说明操作。)
非常重要:将来每当您升级 RVM 时,您都应始终运行 rvm notes 和 rvm requirements,因为通常您会在其中找到有关任何重大更改和/或附加要求的详细信息,以确保您的安装保持正常工作。
一些额外配置
您可以将以下行放入您的 ~/.bashrc
中以获得一些有用的功能
# Display the current RVM ruby selection PS1="\$(/usr/local/rvm/bin/rvm-prompt) $PS1" # RVM bash completion [[ -r /usr/local/rvm/scripts/completion ]] && . /usr/local/rvm/scripts/completion
或者,如果您以单用户身份运行
# Display the current RVM ruby selection PS1="\$($HOME/.rvm/bin/rvm-prompt) $PS1" # RVM bash completion [[ -r "$HOME/.rvm/scripts/completion" ]] && source "$HOME/.rvm/scripts/completion"
使用 RVM
RVM 文档相当全面且具有解释性。但是,这里有一些 RVM 用法示例,可帮助您入门。
Ruby 环境
安装环境
要查看哪些 Ruby 环境可供安装,请运行
$ rvm list known
要安装一个,请运行
$ rvm install <ruby_version>
例如,要安装 Ruby 1.9.2,可以运行以下命令
$ rvm install 1.9.2
这应该下载、配置并在您安装 RVM 的位置安装 Ruby 1.9.2。例如,如果您执行了单用户安装,它将位于 ~/.rvm/rubies/1.9.2
中。
您可以通过执行以下操作来定义默认的 Ruby 解释器
$ rvm use <ruby_version> --default
否则,默认环境将是 /usr
中的系统 Ruby — 如果您使用 pacman 安装了一个 — 或者无。
切换环境
要从一个环境切换到另一个环境,只需运行
$ rvm use <ruby_version>
例如,要切换到 Ruby 1.8.7,可以运行以下命令
$ rvm 1.8.7
(如您所见,标志 use 实际上不是必需的。)
您应该收到一条消息,告诉您切换已成功。可以通过运行以下命令来确认
$ ruby --version
请注意,此环境将仅在当前 shell 中使用。您可以打开另一个 shell,并并行为该 shell 选择不同的环境。
如果您已如上所述设置了默认解释器,则可以使用以下命令进行切换
$ rvm default
系统 Ruby
如果您希望使用 RVM 之外的 Ruby 解释器(即标准 Arch Linux 软件包安装在 /usr 中的那个),则可以使用以下命令切换到它
$ rvm system
列出环境
要查看所有已安装的 Ruby 环境,请运行以下命令
$ rvm list
如果您安装了一些 Ruby 版本,这可能会生成如下列表
rvm Rubies => ruby-1.8.7-p249 [ x86_64 ] ruby-1.9.2-head [ x86_64 ] System Ruby system [ x86_64 ]
ASCII 箭头指示当前启用的环境。在本例中,它是 Ruby 1.8.7。这可以通过运行以下命令来确认
$ ruby --version ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux]
Gemset
RVM 具有称为 gemset 的有价值的功能,它使您可以将不同的 gem 集合存储在隔离的独立 Ruby 设置中。这意味着 ruby、gems 和 irb 都是独立的,并且彼此之间以及与系统之间相互隔离。
创建
Gemset 必须先创建才能使用。要为当前 Ruby 创建新的 gemset,请执行以下操作
$ rvm use <ruby_version> $ rvm gemset create <gemset_name>
或者,如果您喜欢 rvm use 提供的简写语法,请使用 --create 选项,如下所示
$ rvm use <ruby_version>@<gemset_name> --create
您还可以为给定的 Ruby 解释器指定默认的 gemset,方法是执行
$ rvm use <ruby_version>@<gemset_name> --default
使用
$ gem list --local --no-version
并检查剩余的内容
$ gem list --local
要使用 gemset
$ rvm gemset use <gemset_name>
您可以在开始使用 Ruby 时切换到 gemset,方法是将 @<gemset_name> 附加到 Ruby 选择器字符串的末尾
$ rvm use <ruby_version>@<gemset_name>
注意
当您安装 Ruby 环境时,它会开箱即用地附带两个 gemset,它们的名称是 default 和 global。您通常会在后者中找到一些预安装的常用 gem,而前者始终为空。
关于 default 和 global gemset 的一点区别:当您根本不使用 gemset 时,您会获得 default 集合中的 gem。如果您使用特定的 gemset(例如 @testing),它将从该 Ruby 的 @global 继承 gem。global gemset 允许您将 gem 共享到所有 gemset。
Gems
在 gemset 中,您可以使用常用的 RubyGems 命令
$ gem install <gem>
添加,
$ gem uninstall <gem>
删除 gems,以及
$ gem list
查看已安装的 gems。
如果您要部署到服务器,或者不想等待 rdoc 和 ri 为每个 gem 安装,则可以为 gem 安装和更新禁用它们。只需将以下两行添加到您的 ~/.gemrc
或 /etc/gemrc
中
install: --no-document update: --no-document
列出
要查看当前 gemset 的名称
$ rvm gemset name
要列出当前 Ruby 解释器的所有命名 gemset
$ rvm gemset list
要列出所有解释器的所有命名 gemset
$ rvm gemset list_all
删除
此操作删除当前的 gemset
$ rvm gemset use <gemset_name> $ rvm gemset delete <gemset_name>
默认情况下,rvm 从当前选定的 Ruby 解释器中删除 gemset。要从不同的解释器(例如 1.9.2)中删除 gemset,请按以下方式运行您的命令
$ rvm 1.9.2 do gemset delete <gemset_name>
清空
此操作删除 gemset 中安装的所有 gem
$ rvm gemset use <gemset_name> $ rvm gemset empty <gemset_name>
RVM
更新
要升级到最新的发布版本
$ rvm get latest
升级到最新的存储库源代码版本(最多的错误修复)
$ rvm get head
记住对多用户设置使用 rvmsudo。经常更新!
卸载
执行
$ rvm implode
将完全清除 RVM 安装 — 清理地 —。
延伸阅读
这只是一个关于使用 RVM 切换 Ruby 版本以及在不同环境中管理不同 gem 集合的简单介绍。您可以使用它做更多的事情!有关更多信息,请查阅非常全面的 RVM 文档。此页面是一个很好的起点。
故障排除
不幸的是,某些 Ruby 补丁级别与 Arch Linux 配合不佳,并且很多时候 RVM 不会选择最新的补丁级别版本进行安装。因此,您需要手动检查 Ruby 网站,并强制 RVM 安装它。
“data definition has no type or storage class”
这似乎是 1.8.7 特有的,但是如果您在编译时遇到此错误,以下步骤将解决您的问题
$ cd src/ruby-1.8.7-p334/ext/dl $ rm callback.func $ touch callback.func $ ruby mkcallback.rb >> callback.func $ rm cbtable.func $ touch cbtable.func $ ruby mkcbtable.rb >> cbtable.func
自然地,将实际的构建路径替换为您的源代码,它将类似于 ~/.rvm/src/
。
RVM 使用错误的 OpenSSL 版本
低于 2.4 的 Ruby 版本需要 OpenSSL 1.0,但 RVM 会尝试使用 OpenSSL 1.1 构建它们。如果您在 ~/.rvm/log/XYZ/make.log
文件中找到以下行,您就会知道是这种情况
/usr/include/openssl/asn1_mac.h:10:2: error: #error "This file is obsolete; please update your software."
首先安装 openssl-1.0AUR,如果尚未安装。
您可以像这样将其指向正确的版本
$ rvm remove <ruby-version> $ PKG_CONFIG_PATH=/usr/lib/openssl-1.0/pkgconfig:/usr/lib/pkgconfig rvm install <ruby-version>
如果上述方法不起作用,请尝试将最后一个命令更改为
PKG_CONFIG_PATH=/usr/lib/openssl-1.0/pkgconfig \ CFLAGS+=" -I/usr/include/openssl-1.0" \ LDFLAGS+=" -L/usr/lib/openssl-1.0 -lssl" \ rvm install <ruby-version>
或者,您也可以使用 RVM 安装 OpenSSL
$ rvm pkg install openssl $ rvm remove X.Y.Z $ rvm install X.Y.Z -C --with-openssl-dir=$HOME/.rvm/usr