昨日、「えー、こんなのも知らないんですかー。えー」って言われて「(゚皿゚メ) ムキー」 ってなったので、rvm (Ruby Version Manager) を遅ればせながら勉強してみました。

rvmとは、色んな種類の Ruby をバージョン毎に別々のパスにインストールし(関連する gem も)、また、それらを簡単に切り替えられるものです。そういえば Perl にも perlbrew っていう良く似た仕組みがありますね。

Ruby の 1.8.6 と 1.8,7 と 1.9.1 と JRuby と Ruby Enterprise Edition を1台のマシンにインストールして必要なときに必要なバージョンのものを使ってムフフフ・・みたいなことが気軽に出来ちゃいます。それぞれ別のパスにインストールされるので、新しいバージョンを気軽に試せるのも嬉しいところです。

ということで、とりあえずインストールしちゃいましょう。インストールはこのワンライナーを実行するだけでおkです。

bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )

あとは .bashrc なり .zshrc なりにこの設定を追加しておいてください。

if [[ -s $HOME/.rvm/scripts/rvm ]] then
    source $HOME/.rvm/scripts/rvm
fi

利用可能なバージョン

rvm list known すると見ることが出来ます。いっぱいある。。わくわくしますね :-)

$ rvm list known

# MRI Rubies
[ruby-]1.8.6[-p399]
[ruby-]1.8.6-head
[ruby-]1.8.7[-p302]
[ruby-]1.8.7-head
[ruby-]1.9.1-p243
[ruby-]1.9.1[-p376]
[ruby-]1.9.1-p429
[ruby-]1.9.1-head
[ruby-]1.9.2-preview1
[ruby-]1.9.2-preview3
[ruby-]1.9.2-rc1
[ruby-]1.9.2-rc2
[ruby-]1.9.2[-p0]
[ruby-]1.9.2-head
ruby-head

# GoRuby
goruby

# JRuby
jruby-1.2.0
jruby-1.3.1
jruby-1.4.0
jruby-1.5.1
jruby-1.5.2
jruby-1.5.3
jruby[-1.5.5]
jruby-head

# Rubinius
rbx-1.0.1
rbx-1.1.0
rbx-1.1.1
rbx[-head]

# Ruby Enterprise Edition
ree-1.8.6
ree[-1.8.7]
ree-1.8.6-head
ree-1.8.7-head

# MagLev
maglev[-24566]
maglev-head

# Mac OS X Snow Leopard Only
macruby-0.6
macruby-[0.7.1]
macruby-nightly
macruby-head

# IronRuby -- Not implemented yet.
ironruby-0.9.3
ironruby-1.0-rc2
ironruby-head


バージョンのインストール&切り替え

では早速ですが、Ruby の 1.8.6, 1.8.7, 1.9.1 をインストールしてみましょう。irb で日本語が打てるようにするため、先に readline を入れてあります。また、Ruby1.8 系ではうまく入らなかったので readline のパスを指定しました。

sudo port install readline
rvm install 1.8.6 -C --with-readline-dir=/opt/local/
rvm install 1.8.7 -C --with-readline-dir=/opt/local/
rvm install 1.9.2

現時点ではこんな感じ。rvm list するとわかります。

$ rvm list

rvm rubies

   ruby-1.8.6-p399 [ x86_64 ]
   ruby-1.8.7-p302 [ x86_64 ]
   ruby-1.9.1-p378 [ x86_64 ]

rvm use xxx で好きなバージョンに切り替えられます。矢印が付くのですぐわかりますね。

$ rvm use 1.8.7
Using /Users/sasata299/.rvm/gems/ruby-1.8.7-p302

$ rvm list

rvm rubies

   ruby-1.8.6-p399 [ x86_64 ]
=> ruby-1.8.7-p302 [ x86_64 ]
   ruby-1.9.1-p378 [ x86_64 ]

あとはシェル起動時にデフォルトで使うバージョンを決めておきましょう。例えば Ruby 1.8.7 をデフォルトで使用したければこのように --default を付けて rvm use するだけです。

rvm use 1.8.7 --default

gem をインストールする

当然 gem はインストールしますよね。rvm を利用する場合、後述しますが gem は $HOME/.rvm 以下にインストールされるため root 権限は必要ありません。また、rvm gemset export/import を使うことで gem を別のバージョンにコピーするのも簡単です。

$ rvm use 1.8.7

# gem をいくつかインストールしたとします
$ gem install rails
$ gem install git
$ gem install haml

# Ruby 1.8.7 でインストールされた gem をdefault.gems という名前で書き出す
$ rvm gemset export

$ rvm use 1.9.1

# default.gems の gem を Ruby 1.9.1 の $GEM_PATH にまとめてインストール
$ rvm gemset import

この例だと Ruby 1.9.1 でも Ruby 1.8.7 でインストールした rails, git, haml の gem がさくっと利用可能になりました。

rvm の仕組み

ところで rvm はどういう仕組みで動いているのでしょうか。

gem env の結果を見ると、Ruby や gem は $HOME/.rvm 以下に保存されてることがわかりますよね。rvm を利用すると全てのものが $HOME/.rvm 以下にインストールされるように設定されるのです。

$ rvm use 1.8.7
$ gem env
  - RUBY EXECUTABLE: /Users/sasata299/.rvm/rubies/ruby-1.9.1-p378/bin/ruby
  - GEM PATHS:
     - /Users/sasata299/.rvm/gems/ruby-1.8.7-p302
     - /Users/sasata299/.rvm/gems/ruby-1.8.7-p302@global

$ rvm use 1.9.1
$ gem env
  - RUBY EXECUTABLE: /Users/sasata299/.rvm/rubies/ruby-1.9.1-p378/bin/ruby
  - GEM PATHS:
      - /Users/sasata299/.rvm/gems/ruby-1.9.1-p378
      - /Users/sasata299/.rvm/gems/ruby-1.9.1-p378@global

気になるのはバージョンを切り替えたときです。一体何が起こっているのか。

実は rvm use してバージョンを切り替えると、環境変数の $PATH や $GEM_PATH がそれぞれのバージョンに併せたパスに書き換えられます。そのおかげで、特に意識することなくそれぞれのバージョンの Ruby や gem が利用出来るわけです。

あ、$IRBRC も書き換えられるので、.irbrc をそれぞれのパスに置いとくと幸せになれます。

使ってみての感想

便利ですね〜。プロジェクト毎に Ruby のバージョン変えたりとかも簡単に出来ます。

rvm って色んなバージョンを切り替えて使うので、別のバージョンに切り替えると gem がいなくなったりして「えっ!?」ってなりそうですが、結局は $PATH や $GEM_PATH をその度に書き換えて、そこにインストールしているだけ。とてもシンプルですね。
このエントリーをはてなブックマークに追加