こんにちは、月曜は結構好きなShinyaです
MacでRubyを使っている人はrbenvでRubyのバージョン切り替えする場合が多いと思いますが、その仕組みまで理解されているでしょうか?
- Rubyのバージョン切り替えが上手くいかない
- 記事を読んで設定してなんとなく使えてる
ということはないでしょうか?
今回はrbenvでRubyのバージョンを切り替える方法を紹介しながら、少しだけその仕組みに踏み込みます(前提:Homebrewはインストール済)
この記事を読んで分かること
- バージョン切り替え方法
- 切り替えの仕組み
- 切り替わらない不具合の原因と解決方法
rbenvのインストール
ターミナルで以下のコマンドを実行します
brew install rbenv ruby-build
インストール完了後、rbenv -v
と打ってバージョン情報が出力されればインストール成功です
rbenvを常時使えるよう設定
切り替えるための手順
rbenvでRubyのバージョンを変えるためには、準備としてターミナルで
eval "$(rbenv init -)"
を実行する必要があります
これにより/Users/user_name/.rbenv/shims/ruby
というrbenvでインストールした各バージョンのRubyの情報が保存されているパスを参照できるようになります
なのでパスを通した後でバージョン切り替えのコマンド
rbenv global x.y.z(←切り替え先バージョン)
または
rbenv local x.y.z(←切り替え先バージョン)
を実行すればRubyのバージョンを切り替えられます
globalはすべてのディレクトリで切り替え、localはカレントディレクトリのみで切り替えという指示になります
なお、切り替え先のバージョンはあらかじめインストールしておく必要があります
rbenv install x.y.z(バージョン)
インストールできるバージョン一覧は以下のコマンドで表示できます
rbenv install --list
以上の手順でRubyバージョンは変更できます
しかしこの方法だとバージョン切り替え前に毎回、eval "$(rbenv init -)"
を実行しないといけないので面倒です
ターミナル起動時にeval "$(rbenv init -)"を自動実行させる設定
そこでターミナル起動と同時にeval "$(rbenv init -)"
を実行するように設定しておくと便利です
そのためには使用しているシェルの設定ファイルにeval "$(rbenv init -)"
を記述しておく必要があります
理解のためにまずシェルの説明を挟んでおきます
シェルとはユーザーとコンピューターを繋ぐ翻訳家的な機能です
コマンドをコンピューターに理解可能な形にしたり、逆にコンピューターの出力を人に分かる形にしたりします

要はターミナルの中の人みたいなものです
ターミナルはシェルとお話しできる窓口といえます
シェルの種類はいくつかあります↓
- sh
- bash
- ksh
- csh
- tcsh
- zsh
Macではターミナルで
echo $SHELL
と打つと現在使っているシェルが分かります
OSがCatalinaの場合、デフォルトのシェルはzshになります(変更可能)
さて話を戻します
rbenvで常時バージョン切り替えをするにはシェルの設定ファイルにeval "$(rbenv init -)"
を書いておく必要がありますと言いましたが、シェルの設定ファイルはシェルごとに違います
なのでデフォルトで使っているシェルの設定ファイルに書かないと機能しません!
僕はrbenv導入当初、デフォルトシェルがzshだったのにbashの設定ファイル(.bash_profile)に記述していました(笑)
そのため切り替え時は毎回、bashの設定ファイルを読み込むコマンド
source ~/.bash_profile
を打ってました
本当はzshの設定ファイルである.zshrcに記述しておけば良かったんですね
でも、自分が何してるか分かってなかったので、その状態に甘んじていました(戒)
さて、それではシェルの設定ファイルにコマンドを書き込む方法を紹介します
方法1
ターミナルでecho 'eval "$(rbenv init -)"' >> ~/.bash_profile
(シェルがbashのとき)echo 'eval "$(rbenv init -)"' >> ~/.zshrc
(シェルがzshのとき)
と打つ
シェルがそれ以外の時は設定ファイルの名前を調べて~/
以降に代入する
方法2
ターミナルでcd ~
と打ちホームディレクトリに移動し、ls -a
でファイルの有無を確認する
デフォルトシェルの設定ファイルがない場合、touch [設定ファイル名]
で新規作成し、open ~/[設定ファイル]
で開いてeval "$(rbenv init -)"
と書き込み閉じる
設定ファイルが既にある場合は新規作成は不要
以上の操作で自動実行するようになります
バージョン切り替え時の頻出コマンド
rbenvにインストール済のRubyのバージョン一覧を表示
rbenv versions
使用中のRubyのバージョンを表示
ruby -v
使用中のRubyのパスを表示
which ruby
ありがちな(?)切り替わらない不具合
先ほど少し触れましたが、デフォルトのシェル以外の設定ファイルにコマンドを記述しても起動時に自動実行されません
なのでzsh使っている人が.bash_profileに書き込んでおいても自動では実行されません
たしか僕は2020年1月にProgateの記事を参考に設定しましたが、そのときはデフォルトのシェルに関わらず
「echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
で設定する」
と説明されていました(今は修正されている)
仕組みが分かっていなかったので、デフォルトのシェルはzshなのにその通りしました
よって当然ながら切り替えが上手くいきませんでした
症状としてはrbenv local [バージョン]
でエラーは出ないものの、ruby -v
で見てみると切り替わってないといった状態でした
色々調べるうちにsource ~/.bash_profile
で切り替え可能になることが分かりずっとそうしていました
つまりわざわざ.bash_profileの記述を読み込んでいたんですね
同じようなことしてる人はぜひデフォルトのシェルの設定ファイルに記述して快適ライフ送ってくださいね
まとめ
- バージョン切り替えコマンド:
rbenv global(or local) [バージョン]
- ただし切り替え前にターミナルで
eval "$(rbenv init -)"
実行が必要 - デフォルトシェルの設定ファイルに書いておけば自動で実行される
以上がrbenvでRubyのバージョンを変える方法でした
それでは、また