🔖

【Rubyのバージョン管理ツール】 rbenvの使い方

2024/06/19に公開

はじめに

すでにHomebrewのインストールが終わった状態として記述しています。

前半はrbenvの使い方、後半はrubyをインストールする際にBUILD FAILED (macOS 14.5 on arm64 using ruby-build 20240612)と表示され、かなりハマったのでその解決方法について記述したいと思います。

ちなみに原因は、MacBook Pro(M1チップ搭載)を使用しているにも関わらず、Intel Mac用のHomebrewをインストールして使用していたことのようでした。

rbenvとは

Rubyのバージョン管理ツールです。同じマシン上で複数のRubyのバージョンを切り替えたりすることができます。
https://github.com/rbenv/rbenv

rbenvのインストール

Homebrewを使ってmacOSにrbenvruby-buildのインストールしてください。

brew install rbenv ruby-build

ruby-build

ruby-buildは、実際にRubyのソースコードをダウンロードし、コンパイル・インストールするためのツールです。

例えば、rbenv installコマンドを使用して特定のRubyバージョンをインストールするためには、システムにruby-buildがインストールされている必要があります。

したがって、rbenvで新しいバージョンのRubyをインストールするには、ruby-buildもインストールしておく必要があります。
https://github.com/rbenv/ruby-build

rbenvを使ってRubyのバージョン管理をするために必要な設定をシェルの設定ファイル (~/.zshrc) に追加してください。これらを追加することで、新しいシェルセッションが開始されるたびに、rbenvを使ったRubyの管理ができるようになります。

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc

rbenvの実行ファイルがインストールされているディレクトリ ($HOME/.rbenv/bin) を、現在のシェルのPATHに追加します。$HOMEはホームディレクトリ(/Users/ユーザーネーム)を指します。

2行目は、rbenv initを実行し、rbenv をシェルに初期化するためのコマンドを生成しています。

環境変数の表示

cat ~/.zshrc

設定ファイルに

現在のシェルを確認する

シェル(Shell)とは、OSにおいてユーザーとシステムとの間で対話を行うためのインタフェースです。

echo $SHELL
  • /bin/zshが表示されれば、zshを使用していることになります。
  • /bin/bashが表示されれば、bashを使用しています。

設定の反映

source ~/.zshrc

インストールできているか確認してください。

rbenv -v

インストールが確認できました。

Homebrewでインストールしたパッケージの一覧を表示してみてください。

brew leaves

# 現在のシステムにインストールされているすべてのパッケージ(依存関係を含む)を表示する場合
brew list

追加されているのがわかると思います。

ちなみに、brew listを使用した場合は下記の表示になります。

Rubyのインストール

インストール可能なRubyのバージョン一覧を取得してください。

rbenv install --list

# すべてのバージョンが表示されます
rbenv install --list-all

今回は最新の安定版である3.3.3をインストールしてみます。

表示されたバージョンの中からインストールしたい Ruby のバージョンを指定してインストールします。

rbenv install 3.3.3

下記が表示されたら、Rubyのバージョン3.3.3がインストールされています。

現在インストールされているRubyのバージョンを表示してインストールされたか確認してみてください。

rbenv versions

*印がついているバージョンがrbenvの現在のバージョンになります。

バージョンの切り替え

システム全体のデフォルトのRubyバージョンを切り替えてみます。

rbenv global 3.3.3

rubyのバージョンを確認してください。切り替わっていない場合は、source ~/.zshrcで再読み込みするか、一度ターミナルを再起動して確認してみてください。

ruby -v

rbenv versions

プロジェクトごとに異なるRubyバージョンを使用したい場合や、特定のバージョンが必要なプロジェクトがある場合は下記のように切り替えてください。rbenv localを使用して設定したRubyバージョンは、そのディレクトリ内でのみ有効です。

rbenv local 3.3.3

BUILD FAILED (macOS 14.5 on arm64 using ruby-build 20240612)と表示される

rbenv install 3.3.3(rubyのインストール)を実行すると下記が表示され、原因が特定できませんでした。

ログの詳細を確認すると、最後の方に下記の記述がありました。

*** Following extensions are not compiled:
openssl:
Could not be configured. It will not be installed.
(省略します)
OpenSSL library could not be found. You might want to use --with-openssl-dir=<dir> option to specify the prefix where OpenSSL is installed.
Check ext/openssl/mkmf.log for more details.
psych:
Could not be configured. It will not be installed.
Check ext/psych/mkmf.log for more details.
*** Fix the problems, then remove these directories and try again if you want.
make[1]: *** [note] Error 1
make: *** [build-ext] Error 2

ちなみに原因は、MacBook Pro(M1チップ搭載)を使用しているにも関わらず、ターミナルのRosettaを使用して開くにチェックが入っており、Homebrew(Intel Mac用)をインストールして使用していたことのようでした。
https://github.com/rbenv/ruby-build/discussions/2335

Homebrew(Intel Mac用)を削除した後にHomebrew(Apple Silicon用)をインストールしたところインストールできるようになりました。

解決方法は、こちらにまとめました。
https://zenn.dev/nenenemo/articles/ccf95cafcd3d19

解決のために参照した他の記事

https://github.com/rbenv/ruby-build/discussions/2404
https://github.com/rbenv/ruby-build/discussions/2185

試したこと

使用されているSSLを確認

openssl version

下記が表示されました。macのデフォルトのOpenSSLがLibreSSLになっているようです。

LibreSSL 3.3.6

rbenvを使ってRubyをインストールする際、RubyバージョンがOpenSSLを必要とする場合があるようです。
Homebrewを使ってインストールしたopenssl@3パッケージのインストール先ディレクトリ(prefix)を確認してみます。

brew --prefix openssl@3

下記が表示されました。この時点で、opt/homebrewではなくて/usr/localとなっていることに早く気付けば良かったです。

/usr/local/opt/openssl@3
rbenv install 3.3.3 -- --with-openssl-dir=/usr/local/opt/openssl@3

openssl@1.1のインストール

openssl@1.1の再インストールしたら解決したという記事もあったので試してみましたが、改善しませんでした。
https://zenn.dev/take_tech/articles/0e6afb8de90077

brew reinstall openssl@1.1

コマンドの最後に--としてからオプションを指定する必要があリます。

rbenv install 3.3.3 -- --with-openssl-dir=/usr/local/opt/openssl@1.1

依存関係の不足がないか確認

下記を確認したところ、不足はありませんでした。

brew list | grep openssl@3
brew list | grep libyaml
brew list | grep readline

終わりに

何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉

Discussion