Ruby

rbenvでRubyバージョン切り替える【仕組みまで理解】

更新日:

こんにちは、月曜は結構好きな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のバージョンを変える方法でした

それでは、また

参考資料

-Ruby
-, , ,

Copyright© 初心者のためのプログラミング独学ブログ , 2020 All Rights Reserved Powered by STINGER.