複数のRubyをインストールし、切り替えて使用できるツール rvm(Ruby Version Manager) の紹介を行いました。

rvmとは

  • Ruby Version Manager の略
  • 複数のRubyをインストールして管理し、切り替えて使う仕組み。
    • MRI(Matz's Ruby Implementation), JRuby, Rubinius, REE(Ruby Enterprise Edition), MacRubyに対応しています。
  • 2009年夏に登場しました。
  • ほとんどシェル関数で実装されています。

ご注意

この記事の内容は2009年12月4日時点のものです。執筆時点で、rvmは活発に開発が進められているため、最新の状態とは挙動が異なる可能性があります。

用途(例)

  • 広く使われるライブラリを、異なるruby実装でテストしたい。
  • 使用しているRubyが異なる古いプロダクトを保守したい。

情報源

インストール

gemで

$ sudo gem install rvm
$ rvm-install

インストールが済んだらgemは削除して構いません。

$ sudo gem uninstall rvm

gitで

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

どちらの場合も ~/.rvm 以下にファイルがコピーされ、rvmコマンドが使えるようになります。 このとき ~/.bashrc・~/.bash_profile・~/.zshrc のすべてが書き換えられます。存在しない場合、作成されます。不要なら消しましょう。

主なコマンド

$ rvm info - 現在の実行環境を表示
$ rvm list - 管理しているrubyの一覧を表示
$ rvm install 名前 - 指定されたrubyをインストール
$ rvm use 名前 - 現在のシェルで使用するrubyを切り替える
$ rvm ruby ... - rubyを一括実行
$ rvm gem ... - gemを一括実行
$ rvm rake ... - rakeを一括実行
$ rvm tests ... - rake testを一括実行
$ rvm specs ... - rake specを一括実行

rubyのインストール

インストールしていないものも含め、使える名前のリストを表示します。

$ rvm list --all
(ruby-)1.8.0-tv1_8_0
:
(ruby-)1.8.7(-p174)
:
macruby-head # Build from the macruby git repository

リストから名前を指定してインストールします。リスト内の名前の括弧内は省略できます。

$ rvm install 1.8.7

~/.rvm の下にインストールしたRubyの関連ファイル一式が置かれます。

rubyの切り替え

基本的な仕組みは、

  • PATHの先頭部に .rvmの管轄下のものを前置。あれば入れ替え。
  • ラッパースクリプトでの環境変数(GEM_HOMEなど)の切り替え。
で実現されています。
$ echo $PATH
$ rvm use 1.8.7
$ echo $PATH (先頭部分が変化する)

irb, rake, gemなども対応するものが使えるようになる。

ディレクトリごとの自動切り替え

カレントディレクトリに .rvmrc ファイルがあり、そこに

rvm ruby-1.8.7-p174

のように記述しておくと、このディレクトリおよびサブディレクトリに対するrubyを変更することが出来ます。

$ cd ~/project1; ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin9]
$ cd ~/project2; ruby -v
ruby 1.8.6 (2009-08-04 patchlevel 383) [i386-darwin9.8.0]
$ cd ~/project3; ruby -v
ruby 1.9.2dev (2009-12-02 trunk 25977) [i386-darwin9.8.0]

cdコマンドがシェル関数で再実装されており、ホームディレクトリや / に到達するまでディレクトリを遡って .rvmrc を探し、見つかったものを評価することで切り替えを実現しています。

一括実行

$ rvm ruby -v
$ rvm gem install rails
$ rvm specs

インストールされているrubyで該当処理を順次実行していきます。

複数のRubyに対して一括でgemをインストールしたり、テストを実行したりできます。

gemセット

使用するrubyの名前の後ろに%と任意のラベルを付けてgemセットを指定することができます。この仕組みにより、同じrubyを使用しつつ、異なるgem構成を使うことができます。

$ cd ~/project1; gem list
$ cd ~/project2; gem list
$ cd ~/project3; gem list

質疑応答

Q: インストールにRubyは必要?

A: gitで入れるなら不要。

Q: Passengerで使うには?

A: PassengerRubyには、passenger-install-apache2-module が表示するパスではなく、rvmのラッパースクリプトを指定する。ラッパーの中で必要な環境変数の設定を行ってから対象のRubyをexecしている。 [http://rvm.beginrescueend.com/passenger/]

ただし、発表者は未検証。

  • このエントリーをはてなブックマークに追加
Feedforce Developer Blog

新しいブログへ移行しました!こちらもよろしくお願いします。