ITエンジニアによるITエンジニアのためのブログ

RVM利用時、ターミナルの新規タブでもRubyバージョンを自動で切り替える設定

本記事では、Ruby Version Manager (RVM) を利用している環境で、ターミナルの新しいタブを開いた際に、プロジェクトで指定されたRubyのバージョンが自動的に適用されるようにするための設定方法を解説します。

1. RVMの自動バージョン切り替え機能

Ruby on Railsなどで開発を行う際、プロジェクトごとに異なるRubyのバージョンを管理するために RVM (Ruby Version Manager) は非常に役立つツールです。

RVMには、プロジェクトのルートディレクトリに移動すると、そのプロジェクトが使用しているRubyのバージョンに自動で切り替える便利な機能があります。これは、ディレクトリ内にある .ruby-version ファイルや Gemfile をRVMが検知することで実現されます。

cdコマンドでの自動切り替え例

# 現在のRubyバージョンを確認
$ rvm current
ruby-2.7.8

# プロジェクトではruby 3.2.8を使用している
$ grep '^ruby' my_ruby_project/Gemfile
ruby '3.2.8'

# プロジェクトのディレクトリに移動
$ cd my_ruby_project

# 自動的にプロジェクトのRubyバージョンに切り替わる
$ rvm current
ruby-3.2.8

この自動切り替えは、RVMがcdコマンドの動作を拡張し、ディレクトリ移動のたびにバージョンチェックを行うことで機能しています。

2. 新規タブで発生する問題

非常に便利な自動切り替え機能ですが、一つ問題があります。

ターミナルエミュレータ(Gnome Terminal, iTerm2など)で新しいタブを開いた時です。新しいタブはカレントディレクトリ(現在いる場所)を引き継ぎますが、cdコマンドは実行されません

そのため、RVMのバージョンチェック機能が作動せず、プロジェクト用のRubyではなく、RVMで設定されたデフォルトのRubyバージョンが読み込まれてしまいます

新しいタブを開いた直後の状態

# 新規タブを開いても、場所はプロジェクトディレクトリのまま
$ pwd
/home/user/my_ruby_project

# しかし、Rubyのバージョンはデフォルトに戻ってしまう
$ rvm current
ruby-2.7.8

これでは、タブを開くたびに手動で cd . などを実行してバージョンを再読み込みさせる必要があり、非常に手間です。

3. シェルの起動スクリプトで解決する

この問題を解決するため、シェルの起動スクリプト(~/.bash_profile~/.zshrc など)に少しコードを追記しましょう。これにより、新しいタブを開いた際に自動でRubyのバージョンをチェックさせることができます。

お使いのシェルに合わせて、以下のコードを各設定ファイルの末尾に追加してください。

# For RVM: Load the correct ruby version on new tabs
if [ -s ".ruby-version" ] || [ -f "Gemfile" ]; then
  rvm use . > /dev/null
fi

スクリプトの仕組み

  1. 新しいタブを開くと、新しいログインシェルが起動します。
    • 重要: この設定を有効にするには、ターミナルエミュレータの設定で「コマンドをログインシェルとして実行する」オプションを有効にしてください。これはRVMが公式に推奨する設定です。設定方法はシェルの説明記事で紹介しています。
  2. シェルが起動する際、~/.bash_profile~/.zshrc などの設定ファイルを読み込みます。
  3. 追加したスクリプトが実行され、カレントディレクトリに .ruby-version または Gemfile が存在するかをチェックします。
  4. ファイルが存在する場合、rvm use . コマンドを実行し、プロジェクトで指定されたRubyバージョンを静かに(> /dev/nullでメッセージを抑制して)読み込みます。

これにより、cd . を手動で実行するのと同じ効果が得られ、常に正しいRubyバージョンで作業を開始できます。

4. まとめ

開発中に複数のターミナルタブを開くことは日常的です。この簡単な設定を追加するだけで、タブを開くたびにRubyのバージョンを気にする必要がなくなり、手動でのコマンド実行の手間やバージョン間違いによるエラーを防ぐことができます。

作業の効率化に直結しますので、RVMをお使いの方はぜひこの設定を試してみてください。