ブログ

読んで思い出す。忘れるために書く

複数 Rails インストール済み環境でのバージョン切り替え挙動について

GitHub Issue に調査結果を書いた のでこちらにも転載

Rails の複数バージョンがインストールされている環境で、どのようにバージョンが切り替わるのか、調査

TL;DR

プロジェクトディレクトリの内外で、Rails に訊ねたバージョンが切り替わる

状況説明 & 再現手順

状況説明を兼ねて、再現手順を記載

大まかな流れ

  1. Rails gem の複数バージョン インストール
  2. バージョンを指定して Rails のプロジェクト作成
  3. プロジェクトディレクトリ 内・外で Rails のバージョン確認

再現手順

状況を同じにするため、次のコマンド群を打つことで再現可能にします

Rails のインストール (複数バージョン)

# バージョンを指定して Rails をインストール
# 2 つの、異なるバージョンをインストールする
gem install rails -v 5.2.4.3
gem install rails -v 6.0.3.2

バージョンを確認

# インストール済みの gem のリストを表示 (Rails)
# (正規表現で「rails」で始まって終わる語を絞り込み)
gem list --local ^rails$

# =>
# *** LOCAL GEMS ***
#
# rails (6.0.3.2, 5.2.4.3)

今有効なバージョンは?

cd ~ # Home ディレクトリに移動

# 最新バージョンが返ってくる
rails -v # => 6.0.3.2

バージョンを指定して Rails プロジェクト作成

#
# 旧版を指定してプロジェクト作成
#
mkdir my_project && cd $_ # プロジェクトディレクトリを作成して移動
rails _5.2.4.3_ new . --skip-bundle

プロジェクトディレクトリ 内・外で Rails のバージョン確認

プロジェクト内

pwd # => /[...snip...]/my_project
rails -v # => 5.2.4.3
bundle e rails -v  # => 5.2.4.3

Rails の場合、プロジェクト内のバージョンを優先的に利用する処理が記述されているらしい

Ref: Rails 4.1以降のコンソールコマンドは必ず bin/ を付けなきゃいけないの? - Qiita , なんで bin/ がいらないの?

(つまり、Rails でない場合、 bundle exec 無しだと ここで最新バージョンが返ってくる)

プロジェクト外

cd ~ # Home ディレクトリに移動
# 最新バージョンが返ってくる
rails -v # => 6.0.3.2