rbenv plugin としてインストールした ruby-build が動かないときは ${RBENV_ROOT} を疑う

とある Ruby 環境(長年稼働している)で以前から rbenv + ruby-build の挙動が微妙で,このまま放置するのはダメだろう!と勝手に奮起して調べてみた.

結論から言うと /etc/profileRBENV_ROOT の設定がされていて悪さをしていた.RBENV_ROOT の存在に気付くまではワークアラウンド的に ruby-build をスタンドアロンで動かす方針で考えていたけど,ruby-build のバージョンが超古かったりもした.貴重な連休にハマった...!w

起きていた事象

具体的に書くと rbenv で 1.9.2-p2902.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 を読んだり,コードを読んだりすると解決の糸口を掴める.

github.com

github.com