rbenvで複数バージョンのRubyを切り替える。

勉強用の環境に入ってるRubyが、以前、Redmineを入れたときの都合でRuby Enterprise EditionというカスタマイズされたRuby 1.8になっていた。

$ ruby -v
ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux], MBARI 0x6770, Ruby Enterprise Edition 2011.03

Redmineは試しに入れたままほぼ触っていないが、動作環境を壊すのも避けたいので、複数バージョンのRubyを切り替えて仕組みを入れてみた。

以前は「rvm」という名前を見かけたが、速さや使い勝手から最近は「rbenv」が人気なようなので今回はそちらを試す。

  • rbenvのインストール

githubで公開されているレポジトリを複製(clone)する。

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
  • .bash_profileを編集

ログイン時に~/.rbenv/binにパスを通し、rbenvの初期化らしき処理を実行させる。

export PATH="$HOME/.rbenv/bin:$PATH:$HOME/bin"
eval "$(rbenv init -)"

※ 個人的に$HOME/binにもパスを通してるがこれは必須ではない。

  • rbenv-buildのインストール

任意のバージョンのRubyをビルドするrbenv-buildというのも入れる。
/usr/local/share/ruby-buildを作ろうとしてエラーになったのでsudoをかけたけど、ウェブで見かける情報だと一般ユーザのまま実行している例が多い。どういうことだろう?

$ cd
$ git clone git://github.com/sstephenson/ruby-build.git
$ sudo ./install.sh
  • rbenvを使ってRubyをインストール

http://www.ruby-lang.org/ja/downloads/に記載された1.8系と1.9系の最新の安定版を入れてみる。

$ rbenv install 1.9.3-p0
$ rbenv install 1.8.7-p357

安いVPSだからなのかインストールには数分かかった。インストールが終わったら下記の操作が必要らしい。

$rbenv rehash

インストール済みのバージョン一覧を見るとちゃんと追加されているのがわかる。

$ rbenv versions
  1.9.3-p0
  1.8.7-p357
  • Rubyのバージョンを切り替える。

rubyと打ったときに実行されるバージョンを切り替えるには下記のようにする。

$ rbenv global 1.9.3-p0

現在設定されているバージョンを確認する。

$ rbenv version
1.9.3-p0 (set by /home/keme/.rbenv/version)
  • 特定ディレクトリ以下で使うRubyのバージョンを指定する。

また、ディレクトリを指定してバージョンを切り替えられるらしい。ナニソレスゴイ!

$ mkdir use_1.8
$ cd use_1.8/
$ rbenv local 1.8.7-p357

rbenvによるバージョン指定が有効な状態でバージョン一覧を表示させると使っているバージョンに*が付く。

$ rbenv versions
∗ 1.8.7-p357 (set by /home/keme/use_1.8/.rbenv-version)
  1.9.3-p0

サブディレクトリを掘るとそこもちゃんと指定したバージョンになっている。

$ mkdir sub
$ cd sub/
$ ruby -v
ruby 1.8.7 (2011-12-28 patchlevel 357) [x86_64-linux]

rbenv globalを実行したディレクトリにはバージョンを示すドットファイルが作られていた。どういう仕組みなんだろ?

$ cat .rbenv-version
1.8.7-p357
  • 一時的にRubyのバージョンを切り替える。

一時的にバージョンを切り替える場合にはrbenv shellを使う。

$ rbenv shell 1.9.3-p0

このrbenv shellの効力はrbenv localより強いらしい。shell > local > globalでいいのかな?

$ cd use_1.8/
$ ruby -v
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]

ちゃんと仕組みは調べていないけど、シェル変数RBENV_VERSIONにバージョン情報を持たせていたので、試しにその変数を削除したらrbenv shellの効果が消えた。

$ ruby -v
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]
$ unset RBENV_VERSION
$ ruby -v
ruby 1.8.7 (2011-12-28 patchlevel 357) [x86_64-linux]

"ruby"と打った時にドットファイルやシェル変数を見て実行するバイナリを切り替えてるようなので、高頻度で実行されるような場面ではオーバーヘッドがどの程度出るのか気になった。

ただ、コマンドの数も少ないし、動きもわかりやすいので普通に使う分には便利だわー