とある Ruby 環境(長年稼働している)で以前から rbenv + ruby-build の挙動が微妙で,このまま放置するのはダメだろう!と勝手に奮起して調べてみた.
結論から言うと /etc/profile
に RBENV_ROOT
の設定がされていて悪さをしていた.RBENV_ROOT
の存在に気付くまではワークアラウンド的に ruby-build をスタンドアロンで動かす方針で考えていたけど,ruby-build のバージョンが超古かったりもした.貴重な連休にハマった...!w
起きていた事象
具体的に書くと rbenv で 1.9.2-p290
と 2.1.0-dev
がインストールされていて,特定のディレクトリに .ruby-version
を置いて 2.1.0-dev
を使おうとしているのに,実際にバージョンを確認すると 2.4.0dev
になっている.完全にズレてる!という感じだった.
$ rbenv versions * 1.9.2-p290 (set by /usr/local/rbenv/version) 2.1.0-dev $ cat .ruby-version 2.1.0-dev $ ruby -v ruby 2.4.0dev (2016-03-10 trunk 54080) [x86_64-linux]
rbenv と ruby-build
rbenv install --list
を叩くと以下の状況だった.普通に考えて古そうだけど,rbenv は最新にしていた.
$ rbenv install --list Available versions: (中略) 1.9.1-p378 1.9.1-p430 1.9.2-p180 1.9.2-p290 1.9.2-p318 1.9.2-p320 1.9.3-dev 1.9.3-p0 1.9.3-p125 1.9.3-p194 1.9.3-p286 1.9.3-p327 1.9.3-p362 1.9.3-p374 1.9.3-p385 1.9.3-p392 1.9.3-preview1 1.9.3-rc1 2.0.0-dev 2.0.0-p0 2.0.0-preview1 2.0.0-preview2 2.0.0-rc1 2.0.0-rc2 2.1.0-dev (中略)
ruby-build も rbenv の plugin としてインストールしていて,最新版にしていた.
$ ls -l ~/.rbenv/plugins/ruby-build/share/ruby-build total 860 (中略) -rw-rw-r-- 1 user user 568 May 3 14:37 2.1.0 -rw-rw-r-- 1 user user 331 May 3 14:37 2.1.0-dev -rw-rw-r-- 1 user user 573 May 3 14:37 2.1.0-preview1 -rw-rw-r-- 1 user user 573 May 3 14:37 2.1.0-preview2 -rw-rw-r-- 1 user user 563 May 3 14:37 2.1.0-rc1 -rw-rw-r-- 1 user user 568 May 3 14:37 2.1.1 -rw-rw-r-- 1 user user 405 May 3 14:37 2.1.10 -rw-rw-r-- 1 user user 403 May 3 14:37 2.1.2 -rw-rw-r-- 1 user user 403 May 3 14:37 2.1.3 -rw-rw-r-- 1 user user 403 May 3 14:37 2.1.4 -rw-rw-r-- 1 user user 403 May 3 14:37 2.1.5 -rw-rw-r-- 1 user user 403 May 3 14:37 2.1.6 -rw-rw-r-- 1 user user 403 May 3 14:37 2.1.7 -rw-rw-r-- 1 user user 403 May 3 14:37 2.1.8 -rw-rw-r-- 1 user user 403 May 3 14:37 2.1.9 -rw-rw-r--. 1 user user 386 Mar 10 14:31 2.2.0 -rw-rw-r--. 1 user user 314 Mar 10 14:31 2.2.0-dev -rw-rw-r--. 1 user user 404 Mar 10 14:31 2.2.0-preview1 -rw-rw-r--. 1 user user 404 Mar 10 14:31 2.2.0-preview2 -rw-rw-r--. 1 user user 394 Mar 10 14:31 2.2.0-rc1 -rw-rw-r--. 1 user user 386 Mar 10 14:31 2.2.1 -rw-rw-r--. 1 user user 386 Mar 10 14:31 2.2.2 -rw-rw-r--. 1 user user 386 Mar 10 14:31 2.2.3 -rw-rw-r--. 1 user user 386 Mar 10 14:31 2.2.4 -rw-rw-r-- 1 user user 386 May 3 14:37 2.2.5 -rw-rw-r--. 1 user user 386 Mar 10 14:31 2.3.0 -rw-rw-r--. 1 user user 314 Mar 10 14:31 2.3.0-dev -rw-rw-r--. 1 user user 404 Mar 10 14:31 2.3.0-preview1 -rw-rw-r--. 1 user user 404 Mar 10 14:31 2.3.0-preview2 -rw-rw-r-- 1 user user 386 May 3 14:37 2.3.1 -rw-rw-r--. 1 user user 307 Mar 10 14:31 2.4.0-dev (中略)
ruby-build --version
ruby-build plugin がうまく動いていないような気がして,試しにスタンドアロンの ruby-build を確認したら既にインストールされた形跡があり,さらに超古かったことが発覚した.
$ ruby-build --version ruby-build 20130501 $ ls -l /usr/local/bin/ruby-build -rwxr-xr-x. 1 root root 19251 May 13 2013 /usr/local/bin/ruby-build
ruby-build を正しく最新にする
ワークアラウンドとして install.sh
を流したら,スタンドアロンの ruby-build が最新になって解決した.
$ sudo sh install.sh $ ruby-build --version ruby-build 20160426 $ rbenv install --list Available versions: (中略) 2.1.0-dev 2.1.0-preview1 2.1.0-preview2 2.1.0-rc1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.1.10 2.2.0-dev 2.2.0-preview1 2.2.0-preview2 2.2.0-rc1 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.3.0-dev 2.3.0-preview1 2.3.0-preview2 2.3.0 2.3.1 2.4.0-dev (中略)
RBENV_ROOT の罠
ただ ruby-build をスタンドアロンで動かす気はなくて,本当は rbenv の plugin として動かしたかった.
rbenv のコードを読んでいたら ${RBENV_ROOT}/plugins
ディレクトリをチェックしていることがわかって,まさかと思って ${RBENV_ROOT}
を確認してみたら /usr/local/rbenv
になっていた.
$ echo ${RBENV_ROOT} /usr/local/rbenv $ rbenv root /usr/local/rbenv
さらに調べてみたら /etc/profile
で環境変数が設定されていて,削除したところ ${RBENV_ROOT}
はブランクになり,rbenv root
の設定も正しくなった.以上で全ては万事解決して,スタンドアロンの ruby-build なしで rbenv install --list
が打てるようになった.良かった良かった.
$ ls -l /etc/profile -rw-r--r--. 1 root root 1894 May 13 2013 /etc/profile $ echo ${RBENV_ROOT} $ rbenv root /home/user/.rbenv
まとめ
結構ハマった!rbenv と ruby-build の仕組みをちゃんと理解してたらすぐに原因を特定できた気がするけど,まぁ勉強になったから良しとしよう.困ったときは GitHub の README を読んだり,コードを読んだりすると解決の糸口を掴める.