rvmからrbenvに切り替えてみたのでrbenvがどういう方法でRubyバージョンを指定したり、状況によって切り替えることができるのか確認してみた。基本 https://github.com/sstephenson/rbenv/ の要約および動作確認、バージョンは0.4.0。
shims
~/.rbenv/shimsにあるスクリプトが使うコマンド(irb, gem, rake, rails, rubyなど)を振り分けてくれる。shimsが振り分けた先を知るにはrbenv which
を使う。
$ rbenv which ruby
~/.rbenv/versions/1.9.3-p392/bin/ruby
bundleなどgemでインストールして新しいコマンドが増える場合は~/.rbenv/shimsに振り分けるスクリプトを置かないといけないのでrbenv rehash
を唱える必要がある。
RBENV_VERSION
ドキュメントによると RBENV_VERSION 環境変数が使うバージョンを決める。従ってコマンドラインからだと以下で切り替えられる。
$ export RBENV_VERSION=1.9.3-p392
$ ruby -v
ruby 1.9.3p392 ...
global/local/shell
実際のところRBENV_VERSIONは直接意識しなくてもいいようになっている。
使うデフォルトのバージョンを固定したい場合は global を使う。すると ~/.rbenv/version に使うバージョンが書き込まれる。
$ rbenv global 1.9.3-p392
プロジェクトで特定のバージョンを使いたいときは、 local を使う。すると、カレントディレクトリの .ruby-version に使うバージョンが書き込まれる。
$ rbenv local 1.8.7-p371
コマンドラインから一時的に切り替えたい場合は shell を使う。すると、環境変数 RBENV_VERSION に設定される。
$ rbenv shell 2.0.0-p0
localおよびshellに指定したバージョンは--unsetオプションにより取り消せる(globalは取り消せなかった、後述のsystemに戻すことで代用できる)。なおlocalの場合は .ruby-version ファイルが削除される。
$ rbenv local --unset
$ rbenv shell --unset
念のため実験したところ優先順位はちゃんとshell > local > globalの順で適応された。つまりは 環境変数 RBENV_VERSION > カレントディレクトリの .ruby-version > ~/.rbenv/version の順に優先されることになる。
system
ディストリビューションなどで例えば/usr/bin/rubyにRubyがインストールされていることがある。こういったRubyは system というキーワードで指定することができる。
$ rbenv shell system
$ rbenv local system
$ rbenv global system
rbenv global --unset
の代わりとしてrbenv global system
が利用できる。
古い.rbenv-version
互換性のために.rbenv-versionから.ruby-versionを使うようになっている。
- .rbenv-versionと.ruby-versionの両方が存在する場合
- .ruby-versionが優先される
-
rbenv local
使った場合は.ruby-versionのみ更新される -
rbenv local --unset
使った場合は.ruby-versionも.rbenv-versoinも削除される - .rbenv-versionだけがある場合
-
rbenv local
を実行すると.rbenv-versionが削除され.ruby-versionが作成される。 -
rbenv local --unset
使った場合は.rbenv-versoinが削除される。