[asdf/Ruby] 使用 asdf 和 asdf-ruby 插件安装多个 Ruby 版本

使用 asdf 和 asdf-ruby 插件安装多个 Ruby 版本

asdf 是用于管理多个运行时版本的单个 CLI 工具。 它扩展了一个简单的插件系统来安装你最喜欢的编程语言、框架或软件工具:Dart、Flutter、Elixir、Golang (Go)、Java、Node.js、Python、Ruby 等等。

本文介绍如何使用 asdf 和 Ruby 插件通过 Homebrew 包管理器在 macOS 上安装多个 Ruby 版本。

推荐理由

CloudoLife 推荐使用 asdf 统一管理不同工具/编程语言/运行环境多版本。推荐理由:

  • 简单性,只需要安装 asdf 和对应工具/编程语言/运行环境的插件,无需为不同的工具/编程语言/运行环境安装其他多版本管理工具。

  • 一致性,使用相同的 asdf 基本命令和配置,可以统一管理不同工具/编程语言/运行环境多版本,按您所需,灵活熟练切换不同版本。

  • 多样性,官方和社区插件已经支持多达数百种工具/编程语言/运行环境,几乎涵盖到所有工具/编程语言/运行环境。

  • 及时性,插件支持的工具/编程语言/运行环境与上游保持同步,版本更新非常及时,非常容易尝试新版本。

先决条件

  • Xcode Command Line Tools

    Xcode Command Line Tools 是一个小型的独立包,可从 Xcode 单独下载,它允许您在 macOS 中进行命令行开发,它由 macOS SDK 和命令行工具(如 Clang)组成。

    有关安装和使用 Xcode 命令行工具的更多信息,请参阅 Xcode Command Line Tools

  • Homebrew

    Homebrew 是 macOS(或 Linux)的缺失包管理器。

    有关安装和使用 Homebrew 的更多信息,请参阅Homebrew - https://brew.sh/.

安装

安装 asdf

1
2
3
4
5
# 安装 asdf 依赖
$ brew install coreutils curl git

# 安装 asdf
$ brew install asdf

安装 asdf Ruby Plugin

1
2
3
4
5
# 安装 Ruby Plugin依赖
$ brew install openssl readline

# 安装 asdf Ruby Plugin
$ asdf plugin-add ruby https://github.com/asdf-vm/asdf-ruby.git

添加到你的 Shell

假设使用 zsh,运行以下命令将内容添加到 ~/.zshrc:

1
$ echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc

或查看 [3. Install asdf | Getting Started | asdf - https://asdf-vm.com/guide/getting-started.html#_3-install-asdf]https://asdf-vm.com/guide/getting-started.html#_3-install-asdf) 了解何时使用配置其他 Shell.

列出所有 Ruby 版本

更新 Ruby 插件。

1
$ asdf plugin update ruby

列出所有 Ruby 版本。

1
$ asdf list all ruby

安装 Ruby 版本

手动安装 Ruby 版本。

1
2
3
4
$ asdf install ruby 3.0.2

# 或者安装其他版本
# $ asdf install ruby 2.6.1

配置 Ruby 版本

创建或修改 .tool-versions 文件(当前目录生效)或 ~.tool-versions 文件(全局生效)配置 Ruby 版本。

配置使用 Ruby 3.0.2 版本

1
2
3
4
5
$ cat .tool-versions
ruby 3.0.2

$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-darwin20]

配置使用 Ruby 2.6.1 版本

1
2
3
4
5
$ cat .tool-versions
ruby 2.6.1

$ ruby -v
ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin19]

从另一个 Ruby 版本管理器迁移过来

asdf 使用 .tool-versions 在软件版本之间自动切换。 为了简化迁移,您可以让它读取现有的 .ruby-version 文件以找出应该使用的 Ruby 版本。 为此,将以下内容添加到 $HOME/.asdfrc:

1
legacy_version_file = yes

如果您从支持 .ruby-version 中的模糊匹配的版本管理器(如 rvm 或 chruby)迁移,请注意您可能必须更改 .ruby-version 以包含完整版本(例如,将 2.6 更改为 2.6.1)。

常见问题

env: ruby_executable_hooks: No such file or directory

1
2
$ bundle
env: ruby_executable_hooks: No such file or directory

安装 bundler gem,然后运行 bundle

1
2
3
gem install bundler

bundle

/.asdf/shims/rails: line 8: /usr/local/Cellar/asdf/0.9.0/libexec/bin/asdf: No such file or directory

1
2
3
4
5
$ rails c
~/.asdf/shims/rails: line 8: /usr/local/Cellar/asdf/0.9.0/libexec/bin/asdf: No such file or directory

$ cat ~/.asdf/shims/rails
exec /usr/local/Cellar/asdf/0.9.0/libexec/bin/asdf exec "rails" "$@"

备份 ~/.asdf/shims 后,运行 asdf reshim 更新所有 ~/.asdf/shims 文件。

1
2
3
mv ~/.asdf/shims ~/.asdf/shims.bak

asdf reshim

请参阅 bug: Updating asdf did not update version number in shim paths · Issue #1147 · asdf-vm/asdf - https://github.com/asdf-vm/asdf/issues/1147 以了解更多信息。

​参考链接

[1] Manage asdf - https://asdf-vm.com/#/core-manage-asdf

[2] asdf-vm/asdf-ruby: Ruby plugin for asdf version manager - https://github.com/asdf-vm/asdf-ruby

[3] Home · rbenv/ruby-build Wiki - https://github.com/rbenv/ruby-build/wiki#suggested-build-environment

[4] Switching to asdf - https://wolfgangrittner.dev/switching-to-asdf-for-ruby/

[5] ASDF VM Version Manager for Ruby Tutorial - https://www.nikitakazakov.com/asdf-vm-version-manager-for-ruby-tutorial/

[6] Homebrew - https://brew.sh/

[7] How to Use asdf Version Manager on macOS | Peaceful Revolution - https://www.wiserfirst.com/blog/how-to-use-asdf-on-macos/

[8] Zsh - https://www.zsh.org/

[9] Ruby Programming Language - https://www.ruby-lang.org/en/

[10] Bundler: The best way to manage a Ruby application’s gems - https://bundler.io/

[11] Xcode Command Line Tools - https://developer.apple.com/downloads/index.action