2010年3月3日水曜日

Ubuntu9.10作業メモ6:rvmを使って複数バージョンのRubyを同時に利用する

rvm(Ruby Version Manager)を使うと、複数バージョンのRubyの
同時利用が非常に簡単にできます。
1.8.7と1.9.1を切り替えて使ったり、最新の1.9.2のtrunkを試してみたり、
JRuby・Ruby Enterprise Editionのような異なる処理系のRubyを管理する
といったことが手軽に出来るようになります。

主な効能としては、以下のようなものがあります。
  • コマンド一発で新しいRubyをインストール、アンインストール
  • 元からシステムに入っているRubyの環境を一切汚さない(全てのファイルは $HOME/.rvm/ の下に格納)
  • ディレクトリに設定ファイル(.rvmrc)を置くことで、そのディレクトリ下でrubyコマンドが実行されたときに呼び出されるバージョンを指定できる
  • あるスクリプトに対して、インストール済みの全てのRubyをまとめて走らせられる
  • 同様のことがrakeでも可能なので、例えばrake specを全Rubyで試すといったことができる
  • ある一つのバージョンのRubyに対して複数のgem環境を使い分けるGem Sets機能(例えば1.9.1に対して複数のrailsのバージョンを切り替える等ができる)
  • 他多数
なお、現在rvmは頻繁にアップデートを繰り返していますので、
説明した動作と異なる可能性もあることに注意してください。
執筆時点のrvmのバージョンは、0.1.21です。

ちなみに、Windowsにも似たソフトとして、pikというものがあるそうです。
(上記に挙げた機能と同じものが全て存在するかは、わかりませんが)

この記事では、rvmをインストールし、rvm経由でRuby1.8.7と1.9.1をインストールし、
それらが切り替えられるのを確認するところまでやってみます。



それでは、rvmをインストールしてみましょう。
rvmの公式サイトのインストール手引きを見ると、Githubからのインストールが
オススメとありますので、ここではそれで進めてみます。(Gitが必要です)

公式サイトには何やら長いコマンドが書いてありますが、要するに

$ git clone git://github.com/wayneeseguin/rvm.git
$ cd rvm
$ ./install

という手順が守られていれば問題はありません。
公式の手引きで、 $HOME/.rvm/src に対してgit cloneしようとするのは、
rvm本体に備わったアップデート機能を使うとどうせまたそこにgit cloneされるからだと思われます。

また、git cloneに対して「--depth 1」というオプションがついているのは、
要は「私はリポジトリをいじったりしないから、履歴とかなしで
最新のリビジョンのファイルだけコピーしてください」という指定です。
その方がダウンロードする容量が少なくて済むという配慮でしょう。




さて、installスクリプトの実行が完了すると色々とメッセージが表示されます。

重要なのは後半の「You must now finish the install manually:」以下の部分です。
指示通り、そこに表示された一行をシェルの設定ファイルの最後に書き込みましょう。
自分の場合は、 $HOME/.bashrc の最後に以下を書き込みました。(人によって内容が違うはずです)
if [[ -s /home/oshow/.rvm/scripts/rvm ]] ; then source /home/oshow/.rvm/scripts/rvm ; fi

(※2010年12月30日追記:現在は以下のような一行を追加せよと指示されます。意味は同じです)
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"


もう一つ重要なのは、rvmでRubyをインストールする際に必要なパッケージ類の説明です。
rvmではRubyのインストールは基本的にソースからのビルドなので、
ビルドのためのパッケージを準備しなければなりません。
ここでは普通に1.8.7と1.9.1をインストールしたいので、
「*  For MRI & ree (if you wish to use it) you will need:」と書かれた行を探してみてください。

$ aptitude install curl bison build-essential zlib1g-dev libssl-dev libreadline5-dev libxml2-dev git-core

と書かれています。これらがビルドに必要なパッケージです。
自分の場合はGitが既に入っているので、それを除いて、

$ sudo aptitude install curl bison build-essential zlib1g-dev libssl-dev libreadline5-dev libxml2-dev

のように実行しました。

また、上記の説明文を見逃してしまっても、
rvmのアップデートコマンド( rvm update --head )を使う度に見れますので安心してください。
(※2010年6月8日追記:現在は rvm notes コマンドで見られるようです。)

(※2010年12月30日追記:rvm update --head というコマンドは古くて、現在は rvm get head を使うようです。)

以上で準備が整ったので、rvmを使っていきましょう。
rvmを使い始める前に、端末を一旦閉じて開き直してください。

まずrvm経由のRubyのインストールです。

$ rvm install 1.8.7
$ rvm install 1.9.1

このようにバージョンを指定するだけでインストールが可能です。
ダウンロード→ビルドと実行されるので、それなりに時間がかかります。
完了したら、バージョンを切り替えられることを確認してみましょう。

$ rvm use 1.8.7
$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-linux]


$ rvm use 1.9.1
$ ruby -v
ruby 1.9.1p378 (2010-01-10 revision 26273) [i686-linux]

となるはずです。
元々入っているRubyに戻すには、

$ rvm use system

とします。


----

rvmの実体はシェルスクリプトの集合体です。rvmはシェルに対して細工を行います
(例えば、cdコマンドを再定義する等)。その辺りが気にかかる方は、十分考慮してから利用してください。

フォロワー