macOS上Ruby版本管理器的比较

在这篇文章中,我将对比Mac上最流行的Ruby版本管理工具:Chruby、Rbenv、RVM,以及多语言版本管理工具Asdf,还有全新用Rust编写的版本管理器Frum。我将根据您的需求可能性提供推荐。

预装的Ruby并非开发者之选

初涉Ruby的开发者发现macOS预装了Ruby时会感到欣喜,但当更有经验的开发者告诉他们“不要使用Mac系统自带的Ruby”时,他们往往会失望。我在其他地方已经阐述了原因。简而言之,系统自带的Ruby是为macOS服务的,而非为您服务。它适合运行实用脚本,但对于开发而言,系统Ruby版本过时,且若不小心,安装gems可能会导致头疼问题(包括系统安全漏洞)。

Homebrew的单一Ruby问题

Homebrew已成为向macOS添加开发者软件的近乎标准的包管理器。它使得避免依赖系统Ruby而安装新版Ruby变得简单。但Homebrew存在两个问题。首先,当安装其他Homebrew包时,Homebrew的Ruby版本可能会自动且意外地被新版本替换(这一问题可通过brew pin ruby解决)。更重要的是,Homebrew只允许您安装一个版本的Ruby。如果您正在开发或维护多个Ruby项目,很可能会需要在不同Ruby版本间切换。这时,您就需要一个版本管理器了。

Asdf 多语言版本管理器

Asdf是一款支持多种语言的版本管理工具。如果你使用Ruby开发基于Rails 6的Web应用,你需要安装Node和Yarn来构建Rails初始应用。(Rails 7可能会取消对Node的需求,但这尚未确定。)

因此,对于Rails开发者而言,Asdf是一个理想的版本管理器。如果你开发Python、Elixir或其他多种语言的应用(查看支持的语言列表),Asdf同样适用。使用Asdf有什么缺点吗?主要有两个:它通过垫片(shims)截取常用命令,这可能使问题排查变得困难;此外,某些操作可能会有点慢。如果你使用多种语言开发,建议尝试Asdf,看看是否适合你。如果发现Asdf影响效率,可以考虑切换到Frum,这是一个仅针对Ruby、用Rust编写的版本管理器。

仅限Ruby的版本管理器

如果你只打算使用Ruby开发应用,可以从四个仅支持Ruby的版本管理器中选择:Chruby、Frum、Rbenv和RVM。这四者的差异主要体现在速度、复杂度以及切换Ruby版本的方式上。我们先从最老的RVM开始了解。

RVM

RVM 是首个广受欢迎的Ruby版本管理器,至今仍得到维护并广泛使用。RVM通过修改系统的cd命令,在切换目录时设置环境变量。为了覆盖cd命令,RVM安装脚本会修改Shell配置文件(新版Mac上的~/.zshrc文件)。

RVM能正确展示环境变量,显示Ruby及gem版本和位置,有助于问题诊断。然而,RVM包含如gemsets等额外功能,现已不再必要,因为核心Ruby加入了Bundler来管理gem依赖。额外的复杂性不再需要,因此许多开发者转向了如Rbenv、Chruby或Frum等更新的版本管理器。

Rbenv

与RVM并列,Rbenv一直是Ruby最流行的版本管理器之一。Rbenv利用shims截获常见的Ruby命令(Asdf也使用shims)。

通过Homebrew安装Rbenv后,必须修改~/.zshrc文件,确保Rbenv的shims优先于普通Ruby命令。Shim调用rbenv exec命令,该命令在执行任何Ruby命令前确定要使用的Ruby版本。

垫片存在两个缺点。首先,垫片通过隐藏实际命令使得故障排除变得更加困难。例如,which ruby命令显示的是Rbenv垫片,而非实际的Ruby版本(若想查看实际的Ruby命令,需设置RBENV_DEBUG环境变量)。其次,垫片可能会给Ruby命令的执行增加微秒级的延迟。(每次运行Ruby命令时,Rbenv都会介入,而RVM只在切换目录时介入。)对于那些注意到延迟或不喜欢垫片概念的开发者,可以选择Chruby或Frum。

Chruby

Chruby虽不如RVM或Rbenv知名,但受到多位知名Ruby开发者的推崇。与RVM不同,它不会覆盖cd命令。与Rbenv或Asdf不同,它不通过垫片拦截命令。你需要修改~/.zshrc文件,以便Chruby在你的本地shell环境中运行。无需修改$PATH,因为Chruby会根据你选择的Ruby版本自动处理。

Chruby还会为Ruby设置特定的环境变量。这就是Chruby在不同Ruby版本间切换所需的全部操作。它完全适用于which命令进行故障排除。我使用Chruby多年,未遇到任何问题。Chruby是一个很好的选择,但你可能还想尝试最新的Ruby版本管理器Frum。

Frum

Frum 是用 Rust 编写的,这是一种适合快速执行系统软件命令行操作的优秀语言。Frum 是一个新工具(2021年初发布)。与 Asdf、Chruby 或 Rbenv 不同,它内置了 Ruby 安装命令,因此无需额外程序来安装 Ruby。安装器速度快,且 Frum 不依赖任何外部组件(它是一个可以通过 Homebrew 安装的完整 Rust 可执行文件)。

安装 Frum 后,你需要修改 ~/.zshrc 文件,以便 Frum 在你的本地 shell 环境中运行。与其他版本管理器类似,它会检查项目目录中是否有 .ruby-version 文件,如果没有为项目指定版本,则默认使用全局 Ruby 版本。它不使用 shim(与 Asdf 或 Rbenv 不同),也不会覆盖 cd 命令(与 RVM 不同)。尽管它很新,但我推荐它,因为它是一体化且快速的。

安装 Ruby 的版本管理器

I’ve written a complete guide to installing Ruby on Mac. In the guide, I provide instructions for:

如果你想了解 RVM 或 Rbenv,请参阅:

A Note about Docker

提及Ruby版本管理器时,常有人表示:“我用Docker。”Docker作为一种容器化工具,部分开发者用它进行版本管理。Docker主要用于构建可复现的虚拟服务器,内含运行应用所需的所有软件依赖版本(如语言、数据库、消息队列)。因此,它非常适合创建一个“冻结”的开发环境版本以部署至服务器。

尽管也可在容器内本地开发,但这会带来运行速度减慢、内存需求增加及配置复杂度上升的问题,相比版本管理器更为不便。为简化流程,除非应用极其复杂,否则我不会在本地开发中使用Docker。

总结

若你在多个Ruby项目中工作,你便不只是Ruby的普通用户。确保在你的本地开发环境中安装一个优秀的版本管理器。

I like Asdf because I develop in Ruby and JavaScript and Asdf gives me one version manager for both languages. However, Asdf uses shims (like Rbenv) so occasionally it’s slower than I like. I also find it annoying that Asdf hides the actual command from troubleshooting with the which command. If these drawbacks outweigh the convenience of managing multiple languages, I recommend using Frum to switch among your Ruby versions. Version managers should be simple and stay out of your way when you’re working.

关于MacOS上Ruby版本管理器的常见问题(FAQs)

RVM与rbenv的关键区别是什么?

RVM(Ruby版本管理器)和rbenv都是用于在系统上管理多个Ruby版本的工具。它们的主要区别在于方法上。RVM功能更为丰富,允许你管理gemsets——一组用于特定Ruby应用程序的gems。相比之下,rbenv更为简单,仅专注于切换Ruby版本。它不支持gemsets,但你可以通过名为ruby-build的插件实现类似功能。

如何使用RVM安装特定版本的Ruby?

要使用RVM安装特定版本的Ruby,你可以使用‘rvm install’命令,后跟版本号。例如,要安装Ruby 2.6.3,应使用命令‘rvm install 2.6.3’。安装后,你可以通过‘rvm use’命令切换到此版本,如‘rvm use 2.6.3’。

我可以在同一系统上同时使用RVM和rbenv吗?

尽管技术上可以在同一系统上安装RVM和rbenv,但通常不建议这样做。两者都会修改你的shell环境,同时使用可能导致不可预期的行为。最好根据你的需求选择一个并坚持使用。

如何使用rbenv卸载Ruby版本?

要使用rbenv卸载Ruby版本,你可以使用‘rbenv uninstall’命令,后跟版本号。例如,要卸载Ruby 2.6.3,应使用命令‘rbenv uninstall 2.6.3’。

如何使用RVM设置默认的Ruby版本?

要使用RVM设置默认的Ruby版本,可以使用‘rvm –default use’命令,后跟版本号。例如,要将Ruby 2.6.3设置为默认版本,应使用命令‘rvm –default use 2.6.3’。

如何更新rbenv及其插件?

要更新rbenv及其插件,可以通过git进行。在终端中导航到rbenv目录(通常是‘~/.rbenv’)并运行‘git pull’。然后,导航到每个插件目录并执行相同的操作。

RVM或rbenv可以与其他编程语言一起使用吗?

RVM和rbenv专为管理Ruby版本而设计。如果需要管理其他编程语言的版本,可能需要查看如pyenv(用于Python)或nvm(用于Node.js)等工具。

如何使用rbenv列出所有已安装的Ruby版本?

要使用rbenv列出所有已安装的Ruby版本,可以使用‘rbenv versions’命令。这将显示rbenv可用的所有Ruby版本列表。

如何使用RVM处理gem依赖?

RVM允许通过使用gemsets来管理gem依赖。可以使用‘rvm gemset create’命令创建gemset,使用‘rvm gemset use’命令切换到它,然后根据需要安装gems。

如何使用rbenv安装新的Ruby版本?

要使用rbenv安装新的Ruby版本,可以使用‘rbenv install’命令,后跟版本号。例如,要安装Ruby 2.6.3,应使用命令‘rbenv install 2.6.3’。

Source:
https://www.sitepoint.com/ruby-version-managers-macos/