rvm: 複数のRubyを共存させる最新のやり方

f:id:mirakui:20100503092609p:image
http://favotter.net/status.php?id=13069973879
こんにちは、4月からついに職業Rubyエンジニアになったmirakuiです。
あまり認めたくありませんが、Rubyは事実上、いまだに1.8系から1.9系への移行期にあります。
現在の安定版である1.8.7と1.9.1を開発環境に共存させている人も多いんじゃないでしょうか。

もううんざりだ

俺のMacBookに入ってるRubyをざっと調べてみました。

  • /usr/bin/ruby
    • 1.8.7。多分MacOSX(SnowLeopard)に最初から入ってたやつ?
  • /usr/local/bin/ruby
    • 1.8.7。多分自分でビルドしたやつ
  • /opt/local/bin/ruby
  • /opt/local/bin/ruby1.9

Ruby本体がこれだけあるということは、irb, gem, rake, rails などのコマンドも一式、rubyバイナリの数だけインストールされています。
こんななので、環境変数の設定にハマると一日潰れます。あほか!

rvmで全部良くなる

rvmは、複数バージョンのrubyを切り替えて使うためのツールです。rvm経由でrubyをインストールすると、rubyバイナリやgem等は、自分のホームディレクトリの.rvm/以下に作られます。つまり/usr/localとかが汚れないし、アンインストールも簡単にできます。

RVM(Ruby Version Manager)公式サイト

RVM: Ruby Version Manager -
RVM Ruby Version Manager - Documentation

日本語の解説は以下がわかりやすいです。

RVM [ja.nishimotz.com]

rvmの本体はgithubに公開されています。インストールは以下のとおりです(要git-core、curl)。

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

これだけです。
このコマンドを実行すると、メッセージで表示されると思いますが、以下をshellの設定ファイルに追加しておきましょう。これで、shell起動時に、GEM_HOMEとかGEM_PATH、RUBYLIBといった面倒な環境変数を.rvm以下にセットしてくれます。

if [[ -s /home/◯◯/.rvm/scripts/rvm ]] ; then source /home/◯◯/.rvm/scripts/rvm ; fi

Rubyのインストールと切り替え

rvmを使ってRubyを入れてみましょう。

$ rvm install 1.9.1

これで、Ruby1.9.1がビルドされます。いま入れたRubyをアクティブにしてみましょう。

$ rvm 1.9.1

これだけです。では環境を確認しましょう。

$ which ruby irb rake gem
/home/mirakui/.rvm/rubies/ruby-1.9.1-p378/bin/ruby
/home/mirakui/.rvm/rubies/ruby-1.9.1-p378/bin/irb
/home/mirakui/.rvm/rubies/ruby-1.9.1-p378/bin/rake
/home/mirakui/.rvm/rubies/ruby-1.9.1-p378/bin/gem
$ ruby --version
ruby 1.9.1p378 (2010-01-10 revision 26273) [i686-linux]
$ echo $GEM_HOME
/home/mirakui/.rvm/gems/ruby-1.9.1-p378
$ echo $GEM_PATH
/home/mirakui/.rvm/gems/ruby-1.9.1-p378:/home/mirakui/.rvm/gems/ruby-1.9.1-p378@global

自分のホームディレクトリの.rvm以下に全部入っているのが分かると思います。

$ rvm 1.9.1 --default

とすると、シェルを立ち上げなおしても同様に1.9.1が選択されます。

素晴らしい!

rvmを使うと、Rubyやgemが.rvm以下にまとめられます。これで色んな恩恵があります。

  • pathが一箇所にまとまる
    • /opt〜とか/usr〜とかに散らばっていたrubyが一箇所で管理できるのは嬉しい。
  • アンインストールしやすい
    • 「rvm remove 1.9.1」ってやるとすぐ消せます。新しいバージョンのrubyが出ても気軽に試して消したりできます。
  • 持ち運びやすい
    • サーバを複数台運用している場合、.rvmごとコピーすれば、(同じカーネルの環境なら)そのまま動かせます。
  • 安全
    • sudoコマンドを使わないので、悪質なgemをインストールしちゃったときに/bin/lsとかを書き換えられなくて済みます*1。(見たことないですが)

*1:話は別になりますが、gemコマンドをやたらとsudoで実行するのはやめましょう。システムを書き換えるgemとか作れてしまうので。基本的にはユーザのホームディレクトリに入れるのが安全です