使用 Homebrew 管理 Ruby

macOS 上的 Ruby 环境管理我相信是大多数软件开发都会遇到的一个问题,如果我们需要同时管理多个 Ruby 版本的话,有 rbenvrvm 的方式,具体的操作网上已有大量的文章供我们学习,本文不再做赘述。今天我们来看一下如何使用 Homebrew 来管理我们的 Ruby。

什么情况下我们可以使用 Homebrew 来管理我们的 Ruby 环境?

  • 你只是学习一下 Ruby 语言
  • 你只是想编译一个项目(例如我们使用 cocoapods 来管理我们的项目)

在使用之前,首先我们需要知道用 Homebrew 来管理 Ruby 有什么缺点。

  • 当你升级其他 Homebrew 包时,Homebrew 可能会将 Ruby 更新到新版本
  • 你不能非常轻松的在多个 Ruby 版本之间频繁切换

如果你的需求不满足上述描述的话,特别是需要经常切换 Ruby 版本,那么 Homebrew 的方式就不是太适合。

macOS 系统的 Ruby

macOS 预装了“系统Ruby”。macOS Monterey 包含 Ruby 2.6.8,这不是最新版本。使用 macOS 系统 Ruby 不是一个好主意(参见:Do Not Use the MacOS System Ruby)。系统 Ruby 的 which rubyruby -v 如下所示:

我们保留系统 Ruby,使用 Homebrew 来安装最新版 Ruby。

安装 Homebrew

如果你还没安装 Homebrew 的话,请先安装 Homebrew

安装 Ruby

安装最新版的 Ruby

1
$ brew install ruby

配置环境

安装完成后,此时我们输入 which ruby 命令发现使用的还是系统 Ruby,因为我们还需要配置一下 $PATH 环境变量。这里使用 zsh 来举例。

我们执行如下命令来编辑我们的 .zshrc 文件。

1
$ open -e ~/.zshrc

如果安装过 vs code 的话,我们可以使用如下命令来编辑:

1
$ code ~/.zshrc

在 Intel 芯片的电脑上我们在 zshrc 文件末尾加上如下的配置:

1
2
3
4
if [ -d "/usr/local/opt/ruby/bin" ]; then
export PATH=/usr/local/opt/ruby/bin:$PATH
export PATH=`gem environment gemdir`/bin:$PATH
fi

在 Apple 芯片的电脑上我们添加下列配置:

1
2
3
4
if [ -d "/opt/homebrew/opt/ruby/bin" ]; then
export PATH=/opt/homebrew/opt/ruby/bin:$PATH
export PATH=`gem environment gemdir`/bin:$PATH
fi

这会将 Homebrew 安装的 Ruby 设置为比系统 Ruby 有更高的优先级,并添加用于 Ruby gem 的目录。

接下来重新打开终端,以便识别对 .zshrc 的更改。

锁定 Ruby 更新

当您升级其他 Homebrew 包时,Homebrew 可能会将 Ruby 更新到新版本。如果你不想让 Homebrew 的 Ruby 版本被新版本取代,你可以使用

1
$ brew pin ruby

来阻止对 Ruby 的更新。

确认 Ruby 的安装

1
2
3
4
$ echo $PATH

# 若输出类似于如下 ruby 配置,则 ruby 环境切换成功
# /opt/homebrew/lib/ruby/gems/3.0.0/bin:/opt/homebrew/opt/ruby/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

在 Apple 芯片上, 你将看到 /opt/homebrew/, 在 Intel 芯片上, 你将看到 /usr/local/

你可以使用 brew list 命令查看安装了哪些版本的 ruby

1
2
3
$ brew list
==> Formulae
ca-certificates libyaml openssl@1.1 readline ruby

你也可以使用 brew deps --tree --installed 命令查看为 ruby 安装了哪些依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ brew deps --tree --installed
ca-certificates

libyaml

openssl@1.1

readline

ruby
├── libyaml
├── openssl@1.1
│ └── ca-certificates
└── readline

执行命令 ruby -v 验证是否安装了最新版的 Ruby。

参考文档