Rubyバージョン管理ツール『RVM』

概要

RVM = Ruby Version Managerとは、Wayne E. Seguin氏によって開発された、複数Rubyの処理系をインストール、共存させるためのツールです。MRI・REE・JRubyといった複数の有力な処理系が存在するとともに、1.8系から1.9系への過渡期でもある現在、複数の処理系を併用する機会の多いRubyエンジニアから、その利便性で高い支持を得ています。

公式サイト



検証環境

Mac OS X 10.6.6
RVM 1.2.8



インストール

GitからRVMをダウンロードしてインストールします。

$ mkdir -p ~/.rvm/src
$ cd ~/.rvm/src
$ git clone --depth 1 git://github.com/wayneeseguin/rvm.git .
$ ./install

インストール後に表示されるメッセージに従って、.bashrcの末尾に次の一行を追記します。

FILE: ~/.bashrc

[ -s "$HOME/.rvm/scripts/rvm" ] && source "$HOME/.rvm/scripts/rvm"

追記した一行を有効にするため、.bashrcを読み直します(一度シェルを抜けて、入り直してもOKです)。

$ . ~/.bashrc

環境変数が設定されて、RVMが使えるようになりました。

$ type rvm | head -1
rvm is a function
$ echo $rvm_path
/home/tetsuyai/.rvm

インストールできるRubyのバージョンを表示してみましょう。

$ rvm list known
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.6-head
[ruby-]1.8.7[-p334]
[ruby-]1.8.7-head
[ruby-]1.9.1-p378
[ruby-]1.9.1[-p431]
[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[-p180]
[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.6]
jruby-1.6.0.RC3
jruby-head

# Rubinius
rbx-1.0.1
rbx-1.1.0
rbx-1.1.1
rbx-1.2.0
rbx-1.2.1
rbx-1.2.2
rbx[-head]

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

# MagLev
maglev[-25439]
maglev-head

# Mac OS X Snow Leopard Only
macruby[-0.9] # the default macruby
macruby-nightly
macruby-head      # Build from the macruby git repository

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

インストール済みのRubyを表示してみましょう。とはいえ、まだなにもインストールされていません。

$ rvm list

rvm rubies

インストールされたRubyがあると、下記のように一覧として表示されます。先頭に => が付いているものが、利用中のRubyです。

$ rvm list

rvm rubies

   ree-1.8.7-2011.03 [ x86_64 ]
   ruby-1.8.7-p334 [ x86_64 ]
   ruby-1.9.2-head [ x86_64 ]
=> ruby-1.9.2-p180 [ x86_64 ]

RVMの情報を表示してみましょう。

$ rvm info

system:

  system:
    uname:       "Darwin Tiphereth.local 10.6.0 Darwin Kernel Version 10.6.0: Wed Nov 10 18:11:58 PST 2010; root:xnu-1504.9.26~3/RELEASE_X86_64 x86_64"
    bash:        "/bin/bash => GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)"
    zsh:         "/bin/zsh => zsh 4.3.9 (i386-apple-darwin10.0)"

  rvm:
    version:      "rvm 1.2.8 by Wayne E. Seguin (wayneeseguin@gmail.com) [http://rvm.beginrescueend.com/]"

  homes:
    gem:          "not set"
    ruby:         "not set"

  binaries:
    ruby:         "/opt/local/bin/ruby"
    irb:          "/opt/local/bin/irb"
    gem:          "/opt/local/bin/gem"
    rake:         "/opt/local/bin/rake"

  environment:
    PATH:         "/usr/local/ec2-api-tools/bin:/Library/Java/Home/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/Users/foo/.rvm/bin"
    GEM_HOME:     ""
    GEM_PATH:     ""
    MY_RUBY_HOME: ""
    IRBRC:        ""
    RUBYOPT:      ""
    gemset:       ""

Ruby 1.8.7(MRI)をインストールします。デフォルトのreadlineは日本語入力にバグがあるため、MacPortsでインストールしたreadlineを参照するように、オプションを指定しています。バイナリは~/.rvmディレクトリにインストールされるため、root権限は必要ありません。

$ rvm install 1.8.7 -C "--enable-shared, --with-readline-dir=/opt/local"

今後はRVMでインストールしたRuby 1.8.7を使う前提で、これまでのRuby 1.8.7からジェムセットをコピーします。

$ rvm system
$ rvm gemset export system.gems
$ rvm 1.8.7
$ rvm gemset import system

Ruby Enterprise Editionの1.8.7をインストールします。

$ rvm install ree-1.8.7 -C "--enable-shared, --with-readline-dir=/opt/local"

インストールされました。

$ rvm list

rvm rubies

   ree-1.8.7-2011.03 [ x86_64 ]
   ruby-1.8.7-p334 [ x86_64 ]

Ruby Enterprise Editionをデフォルトに指定します。利用中のRubyは先頭に => が付くので、シェルにログインし直しても => が付いたままであることを確認しておきましょう。

$ rvm use ree-1.8.7-2011.03 --default
$ rvm list

rvm rubies

=> ree-1.8.7-2011.03 [ x86_64 ]
   ruby-1.8.7-p334 [ x86_64 ]



補足

rvm use 〜してもRubyが切り替わらない。

~/.rvm/scripts/rvmがうまくsourceされていないとき、この現象が発生します。

私の場合、~/.rvm/scripts/rvmがsourceされなかった原因は、.bashrcの書き方にありました。最初は下記のように書いていた(自分のホームディレクトリを~で表記しています)のですが、この書き方だと~/.rvm/scripts/rvmの部分が正しく認識されていませんでした。

if [ -s "~/.rvm/scripts/rvm" ]; then
    source "~/.rvm/scripts/rvm"
fi

この状態でrvm use 〜すると、正常に切り替わったかのようなメッセージが表示されます。しかしrvm listには => が表示されず、ruby -vでバージョンを確認しても元のままです。

$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10
$ rvm use ree-1.8.7
Using /Users/foo/.rvm/gems/ree-1.8.7-2011.03
$ rvm list

rvm rubies

   ree-1.8.7-2011.03 [ x86_64 ]
   ruby-1.8.7-p334 [ x86_64 ]

$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10]

.bashrcの~/.rvm/scripts/rvmを$HOME/.rvm/scripts/rvmに修正すると、正しくsourceされるようになりました。インストール後のメッセージには$HOMEと書かれていたのですが、勝手に~に書き換えたのが間違いだったということで (^^;;

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

今度は正常に切り替わりました。

$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10]
$ rvm use ree-1.8.7
Using /Users/foo/.rvm/gems/ree-1.8.7-2011.03
$ rvm list

rvm rubies

=> ree-1.8.7-2011.03 [ x86_64 ]
   ruby-1.8.7-p334 [ x86_64 ]

$ ruby -v
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10.6.0], MBARI 0x6770, Ruby Enterprise Edition 2011.03



ジェムセット

RVMにはgemパッケージの組み合わせに名前を付けて管理する機能があり、この組み合わせのことをジェムセットと呼んでいます。ジェムセットを使うと、ジェムセット単位で有効なgemパッケージ群を切り替えることができるため、同じgemパッケージの異なるバージョンを使い分けたり、不必要なgemパッケージがロードされることによる予期しない挙動を避けることができます。


ジェムセットの新規作成

MRIの1.9.2-p180に新しいジェムセットrails3を作成します。

$ rvm use ruby-1.9.2-p180
$ rvm gemset create rails3
'rails3' gemset created (/Users/foo/.rvm/gems/ruby-1.9.2-p180@rails3).

Rubyを選択し、ジェムセットを作成します。$HOME/.rvm/gems/ruby-1.9.2-p180@rails3ディレクトリが作成されます。


ジェムセットの切り替え

有効なジェムセットをrails3に切り替えます。

$ rvm gemset use rails3

ジェムセットを切り替える前後で比較すると、環境変数によってジェムセットを切り替えている様子がわかります。

こちらが切り替える前。環境変数GEM_HOMEにはデフォルトのジェムセットが指定されています。

  environment:
    PATH:         "/Users/foo/.rvm/gems/ruby-1.9.2-p180/bin:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global/bin:/Users/foo/.rvm/rubies/ruby-1.9.2-p180/bin:/Users/foo/.rvm/bin:/Users/foo/bin:/usr/local/ec2-api-tools/bin:/Library/Java/Home/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin"
    GEM_HOME:     "/Users/foo/.rvm/gems/ruby-1.9.2-p180"
    GEM_PATH:     "/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global"

こちらが切り替えた後。環境変数GEM_HOMEにはrails3が指定されています。

  environment:
    PATH:         "/Users/foo/.rvm/gems/ruby-1.9.2-p180@rails3/bin:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global/bin:/Users/foo/.rvm/rubies/ruby-1.9.2-p180/bin:/Users/foo/.rvm/bin:/Users/foo/bin:/usr/local/ec2-api-tools/bin:/Library/Java/Home/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin"
    GEM_HOME:     "/Users/foo/.rvm/gems/ruby-1.9.2-p180@rails3"
    GEM_PATH:     "/Users/foo/.rvm/gems/ruby-1.9.2-p180@rails3:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global"


ジェムセットの一覧

利用中のRubyが持っているジェムセットの一覧、またはすべてのジェムセットの一覧を表示することができます。

利用中のRubyが持っているジェムセットの一覧です。

$ rvm gemset list

gemsets for ruby-1.9.2-p180 (found in /Users/foo/.rvm/gems/ruby-1.9.2-p180)
   global
=> rails3

すべてのジェムセットの一覧です。

$ rvm gemset list_all

gemsets for ree-1.8.7-2011.03 (found in /Users/foo/.rvm/g
ems/ree-1.8.7-2011.03)
=> global


gemsets for ruby-1.8.7-p334 (found in /Users/foo/.rvm/gems/ruby-1.8.7-p334)
=> global


gemsets for ruby-1.9.2-p180 (found in /Users/foo/.rvm/gems/ruby-1.9.2-p180)
   global
=> rails3


ジェムセットの定義

例えばruby-1.9.2-p180をインストールすると、rvmは$HOME/.rvm/gemsディレクトリに2つのジェムセットを作成します。1つはデフォルトのジェムセットruby-1.9.2-p180、もう1つはglobalのジェムセットruby-1.9.2-p180@globalです。

それぞれのジェムセットにどのgemパッケージをインストールするかは、$HOME/.rvm/gemsetsディレクトリのglobal.gemsdefault.gemsを使って定義することができます。

RVMは下記のファイルを検索して、インストールするgemパッケージを決定します。新しいRubyをインストールしたとき、常にインストールしたいgemパッケージがあれば、これらのファイルに定義しておくといいでしょう。

$HOME/.rvm/gemsets/ruby/1.9.2/p180/global.gems
$HOME/.rvm/gemsets/ruby/1.9.2/p180/default.gems
$HOME/.rvm/gemsets/ruby/1.9.2/global.gems
$HOME/.rvm/gemsets/ruby/1.9.2/default.gems
$HOME/.rvm/gemsets/ruby/global.gems
$HOME/.rvm/gemsets/ruby/default.gems
$HOME/.rvm/gemsets/global.gems
$HOME/.rvm/gemsets/default.gems

私の場合、プロジェクトごとに必要なgemパッケージは$RAILS_ROOT/vendor/bundleディレクトリで管理する(この管理にはBundlerを使っています)ため、ジェムセットで管理するgemパッケージはプロジェクトに依存しないものに限っています。

FILE: $HOME/.rvm/gemsets/global.gems

--- .rvm/gemsets/global.gems	2011-05-06 16:30:57.000000000 +0900
+++ .rvm/gemsets/global.gems	2011-05-06 14:39:39.000000000 +0900
@@ -1 +1 @@
rake
+rdoc
+bundler


ジェムセットのエクスポート

ruby-1.9.2-p180のジェムセットrails3rails3.gemsにエクスポートします。

あらかじめエクスポートしたいRubyとジェムセットを選択し、ジェムセットファイル名を指定してエクスポートします。エクスポートされたジェムセットファイルはカレントディレクトリに作成されます。

$ rvm gemset export rails3.gems

ジェムセットファイル名を省略すると、default.gemsという名前で作成されます。

$ rvm gemset export


ジェムセットのインポート

ruby-1.9.2-p180のジェムセットrails3rails3.gemsをインポートします。

あらかじめインポートしたいRubyとジェムセットを選択し、ジェムセットファイル名を指定してインポートします。--createオプションを指定すると、選択したジェムセットが存在しなければ新たに作成します。

$ rvm --create 1.9.2-p180@rails3
$ rvm gemset import rails3.gems

ジェムセットファイル名を省略すると、カレントディレクトリから以下の順番でジェムセットファイルを探します。

  1. 選択中のジェムセットと同じ名前のジェムセットファイル(rails3.gems)
  2. default.gems
  3. system.gems
  4. .gems
$ rvm 1.9.2-p180@rails3
$ rvm gemset import


gemパッケージの削除

ジェムセットに含まれるすべてのgemパッケージ(ジェムセットではありません!)を削除します。本当に削除してもいいか確認されるので、削除する場合は"yes"と入力します。

$ rvm 1.9.2-p180@rails3
$ rvm gemset empty rails3
WARN: Are you SURE you wish to remove the installed gemset for gemset 'ruby-1.9.2-p180@rails3' (/Users/foo/.rvm/gems/ruby-1.9.2-p180@rails3)?
(anything other than 'yes' will cancel) > yes

--forceオプションを指定すると確認なしで削除されます。

$ rvm 1.9.2-p180@rails3
$ rvm --force gemset empty rails3


ジェムセットの削除

ジェムセットそのものを削除します。本当に削除してもいいか確認されるので、削除する場合は"yes"と答えます。

$ rvm 1.9.2-p180@rails3
$ rvm gemset delete rails3
WARN: Are you SURE you wish to remove the entire gemset directory 'rails3' (/Users/foo/.rvm/gems/ruby-1.9.2-p180@rails3)?
(anything other than 'yes' will cancel) > yes

--forceオプションを指定すると確認なしで削除されます。

$ rvm 1.9.2-p180@rails3
$ rvm --force gemset delete rails3