なんのこと?
rbenv を使って複数バージョンの Ruby をインストールしているが,gem のコマンドがなぜか期待と異なるバージョンの Ruby で動いてしまう。
「gem のコマンド」というのは,rails gem によって使えるようになる rails コマンドとか,pry gem による pry コマンドとかのこと。
「異なるバージョンの Ruby で動く」というのは,例えば,デフォルトの Ruby バージョンを 2.5.3 にしてあるのに,pry
して RUBY_VERSION
を表示すると,2.5.1
と表示される,といった具合。
環境
OS は macOS 10.11 および CentOS 7.5 の両方。
rbenv で Ruby 2.5.1 と 2.5.3 がインストールされており,
rbenv global 2.5.3
でデフォルトを Ruby 2.5.3 にしてある。
カレントディレクトリーに .ruby-version
ファイルが存在せず(つまり local
で他のバージョンが有効になっているわけでもなく),rbenv shell
で一時的にバージョンを変えたわけでもない,
それから,rbenv-communal-gems を使って,Ruby 2.5.1 と 2.5.3 の gem は共通化してある。← たぶんここが一つのポイント
rbenv も rbenv-communal-gems も ruby-build も最新版にしてある。
RubyGems のバージョンは
gem -v
で,2.7.6 と出た。最新ではなかった。 ← ここもポイント
実験
gem のコマンドが期待と異なるバージョンの Ruby で動いてしまっていることをいくつかのコマンドで確かめてみる。
pry
コマンドについては「なんのこと?」で既に述べた。
なお,念のためコマンドの実行前に rbenv rehash
もしている。
rails
最近の Ruby on Rails では,rails new
で生成されるファイル群に,Ruby のバージョンが書かれている。
まずは Gemfile。ここには
ruby '2.5.1'
のように,Ruby バージョンを指定する行がある。やはり 2.5.1 になってしまっている。
次に,.ruby-version。これは,rbenv が「このディレクトリーではこのバージョンの Ruby を使うんだ」ということを知るためのファイル。rbenv local X.X.X
を使うとこのファイルが出来るね。
なぜかこちらは
2.5.3
と正常だった。
slimrb
slimrb
コマンドは slim gem を入れると使えるもので,標準入力から得た Slim フォーマットのドキュメントを HTML(なり XML なり)に変換して表示してくれるもの。
まず
slimrb
でコマンドを起動し,
div = RUBY_VERSION
と入力し(改行も入れる),Ctrl+D で終える。
すると
<div>2.5.1</div>
が表示される。やはり Ruby 2.5.1 だ。ふーむ
irb と erb
結論を先に書くと,irb と erb は正常だった。
これはもともと Ruby に入っているコマンドだからなのではないか(コマンドの格納されるディレクトリーが,後で入れた gem のものとは異なる)。
では,irb を。irb
でコマンドを起動し,RUBY_VERSION
を表示。"2.5.3"
と出た。正常。
次に,erb。erb
でコマンドを起動し,
<%= RUBY_VERSION %>
と入力して(改行も),Ctrl+D で終了。2.5.3
と表示された。正常。
解決
いろいろ調べたが,Ruby バージョンが決定される仕組みがよく分からなかった。
そうこうするうち,既述のように RubyGems が最新版でないことに気付いたので,念のため新しくしておこうと,
gem update --system
とやった。念のため,
gem -v
でバージョンを確認。2.7.8 と最新になった。
これで正常になった。
原因は結局分からなかったが,ともかく RubyGems を最新にすることで直った。
RubyGems の History.txt
も眺めてみたけど,英語力が乏しいためか,関係ありそうな記述は見つけられなかった。
この件ではけっこうな時間を無駄に費やしてしまったけど,何だったんだろ〜!