Ruby Freaks Lounge

第40回RVM(Ruby Version Manager)よる環境構築(2)

前回は、RVMのインストール、RVMで Rubyをインストールして使う方法を紹介しました。今回は、以下の3つを紹介していきます。

  • RVMを最新版にアップデートする
  • RVMを使って複数のバージョンのRubyでスクリプトを実行する
  • GemSetsについて

RVMを最新版にアップデートする

RVMは、Bugfixや機能追加が毎日行なわれている活発なプロジェクトです。開発者の方は、なるべく最新のバージョンを使うことを推奨しています。ここでは、RVMを最新版にする方法をみてみましょう。

"rvm update --head"を使用すると開発リポジトリであるhttp://github.com/wayneeseguin/rvmから最新版を取得します。githubから取得するため、環境にgitがインストールされている必要があります。

% rvm update --head

アップデートされたRVMを使うためには、"rvm reload"を実行しRVMを再読み込みさせます。

% rvm reload

RVMを使って複数のバージョンのRubyでスクリプトを実行する

今後、書いたプログラムが各Rubyのバージョンで実行できるかを試したいというときがあります。RVMで必要なRubyをいれても、1回ごとにRVMで切り替えて実行するのも大変です。

そのようなときに、RVMではRVMでインストールしているRubyすべてで実行できる"rvm ruby"というコマンドが用意されています。このコマンドの引数に実行したいファイル名を指定することで、RVMでインストールしたRubyすべてで実行することができます。

% rvm list
rvm Rubies
jruby-1.4.0 [ [i386-java] ]
ruby-1.8.7-p249 [ x86_64 ]
ruby-head [ x86_64 ]
System Ruby
system [ x86_64 ]
% cat string_each.rb
#! /usr/bin/env ruby
str = <<EOF
abc
def
ghi
EOF
str.each do |line|
puts line
end
% rvm ruby string_each.rb
jruby-1.4.0: jruby 1.4.0 (ruby 1.8.7 patchlevel 174) (2009-11-02 69fbfa3) (Java HotSpot(TM) Client VM 1.5.0_20) [i386-java]
abc
def
ghi
ruby-1.8.7-p249: ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10.3.0]
abc
def
ghi
ruby-head: ruby 1.9.2dev (2010-04-04 trunk 27212) [x86_64-darwin10.3.0]
string_each.rb:7:in `<main>': undefined method `each' for "abc\ndef\nghi\n":String (NoMethodError)

この例では、Ruby1.8では問題がないが、Ruby1.9では問題があるということが1回のコマンド実行だけで確認できました。

また、"rvm ruby"は、サブコマンド"ruby"を指定せずに"rvm 実行ファイル名"としても実行できます。

% rvm string_each.rb
jruby-1.4.0: jruby 1.4.0 (ruby 1.8.7 patchlevel 174) (2009-11-02 69fbfa3) (Java HotSpot(TM) Client VM 1.5.0_20) [i386-java]
abc
def
ghi
ruby-1.8.7-p249: ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10.3.0]
abc
def
ghi
ruby-head: ruby 1.9.2dev (2010-04-04 trunk 27212) [x86_64-darwin10.3.0]
string_each.rb:7:in `<main>': undefined method `each' for "abc\ndef\nghi\n":String (NoMethodError)

RVMで多くのRubyをインストールしてしまっているが、特定のバージョンのみで実行したいときもあるでしょう。そのような場合のために、実行するRubyを指定する方法が用意されています。実行方法は、rvmコマンドに続けて実行するRubyの名前をカンマ区切りで指定します。

% rvm ruby-head,ruby-1.8.7-p249 string_each.rb
ruby-head: ruby 1.9.2dev (2010-04-18 trunk 27392) [x86_64-darwin10.3.0]
string_each.rb:7:in `<main>': undefined method `each' for "abc\ndef\nghi\n":String (NoMethodError)
ruby-1.8.7-p249: ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10.3.0]
abc
def
ghi

今度はJRubyでは実行されず、指定したRubyだけで実行されているのが分かります。

GemSetsについて

GemSetsとは、RVMでRubyGemsを管理するという機能です。GemSetsという単位で1つのRubyに対してRubyGemsを管理することができます。

"rvm gemdir"コマンドを使うことで、RubyGemsのパッケージがインストールされる先を確認できます(ここでは、rvm useでruby-1.8.7-p249を指定した後に実施しています⁠⁠。

% rvm gemdir
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249

GemSetsを使用するとRubyGemsがインストール、ロードされるパスが変更され、管理することができます。どのようなGemSetsがあるかは、"rvm gemset list"コマンドで確認できます。RVMでRubyをインストールした直後は、globalというGemSetsがある状態です。

% rvm gemset list
gemsets : for ruby-1.8.7-p249 (found in /Users/takkanm/.rvm/gems/)
global

globalは、その名の通りそのRubyで常に読み込まれるGemSetsで、常に環境変数GEM_PATHの最後に指定されるようになっています。

それでは、新しい GemSetsを作ってみましょう。GemSetsを作るには"rvm gemset create"コマンドを使用します。

% rvm gemset create rails2
Gemset 'rails2' created.
% rvm gemset list
gemsets : for ruby-1.8.7-p249 (found in /Users/takkanm/.rvm/gems/)
global
rails2

作成したGemSetsを使用するには、"rvm gemset use"コマンドを使用します。

% rvm gemdir
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249
% rvm gemset use rails2
Now using gemset 'rails2'
% rvm gemdir
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249@rails2

もしくは"rvm use"を使用する際に、使用するRubyの後ろに"@GemSets名"を指定することで、使用するGemSetsを指定することができます。

% rvm use 1.8.7-p249@rails2
Using ruby 1.8.7 p249 with gemset rails2

また、"rvm use"で使用するRubyを指定するときに"--create"オプションを指定することで新しいGemSetsを作成し、使用することもできます。

% rvm --create use 1.8.7-p249@rails3
Using ruby 1.8.7 p249 with gemset rails3
% rvm gemset list
gemsets : for ruby-1.8.7-p249 (found in /Users/takkanm/.rvm/gems/)
global
rails2
rails3

使用するGemSetsを変更すると、"rvm gemdir"の出力と環境変数$GEM_PATH, $GEM_DIRの内容が変更されます。

% rvm use 1.8.7-p249@rails2
Using ruby 1.8.7 p249 with gemset rails2
% rvm gemdir
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249@rails2
% echo $GEM_PATH
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249@rails2:/Users/takkanm/.rvm/gems/ruby-1.8.7-p249@global
% echo $GEM_HOME
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249@rails2
% rvm use 1.8.7-p249@rails3
Using ruby 1.8.7 p249 with gemset rails3
% rvm gemdir
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249@rails3
% echo $GEM_PATH
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249@rails3:/Users/takkanm/.rvm/gems/ruby-1.8.7-p249@global
% echo $GEM_HOME
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249@rails3

Rails2とRails3の共存

それでは、作成したGemSetsにRubyGemsをインストールしてみましょう。今回は、Ruby on Railsの2系と3系を1つの環境で使いわけるような環境を作成してみます。

最近、Ruby on Railsの時期バージョンであるRails3のベータがリリースされましたが、今までRails2が入っている環境にRails3をインストールすると Rails2を呼びだすことができなくなってしまいます。そこで、GemSetsを使いRails2とRails3を共存できるようにしてみます。

まず、作成したGemSets"rails2"には、Rails2系をインストールしてみます。

% rvm use 1.8.7-p249@rails2
Using ruby 1.8.7 p249 with gemset rails2
% gem install rails
Successfully installed activesupport-2.3.5
Successfully installed activerecord-2.3.5
Successfully installed rack-1.0.1
Successfully installed actionpack-2.3.5
Successfully installed actionmailer-2.3.5
Successfully installed activeresource-2.3.5
Successfully installed rails-2.3.5
7 gems installed
% rails -v
Rails 2.3.5
% which rails
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249@rails2/bin/rails

次に、"rails3"というGemSetsに切り替えて、Rails3をインストールします。

% rvm use 1.8.7-p249@rails3
Using ruby 1.8.7 p249 with gemset rails3
% gem install rails3b
Successfully installed activesupport-2.3.5
Successfully installed mime-types-1.16
Successfully installed polyglot-0.3.1
Successfully installed treetop-1.4.5
Successfully installed mail-2.1.5.3
Successfully installed text-hyphen-1.0.0
Successfully installed text-format-1.0.0
Successfully installed rack-1.1.0
Successfully installed rack-test-0.5.3
Successfully installed rack-mount-0.4.7
Successfully installed abstract-1.0.0
Successfully installed erubis-2.6.5
Successfully installed i18n-0.3.7
Successfully installed tzinfo-0.3.19
Successfully installed builder-2.1.2
Successfully installed memcache-client-1.7.8
Successfully installed bundler-0.9.21
Successfully installed thor-0.13.4
Successfully installed rails3b-3.0.1
19 gems installed
% gem install rails --pre
Successfully installed activesupport-3.0.0.beta3
Successfully installed activemodel-3.0.0.beta3
Successfully installed rack-mount-0.6.3
Successfully installed actionpack-3.0.0.beta3
Successfully installed arel-0.3.3
Successfully installed activerecord-3.0.0.beta3
Successfully installed activeresource-3.0.0.beta3
Successfully installed mail-2.2.0
Successfully installed actionmailer-3.0.0.beta3
Successfully installed railties-3.0.0.beta3
Successfully installed rails-3.0.0.beta3
11 gems installed
% rails -v
Rails 3.0.0.beta3
% which rails
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249@rails3/bin/rails

ここで、使うGemSetsを"rails2"に戻すとRails2を使用できます。

% rvm use 1.8.7-p249@rails2
Using ruby 1.8.7 p249 with gemset rails2
% rails -v
Rails 2.3.5

おわりに

今回は、RVMを使っての実行や、RubyGemsの管理を紹介しました。

RVMは、開発が始まってまだ日が浅く、若干ドラスティックに仕様が変わったときもありますが、とても強力なツールだと私は考えています。今回紹介しきれませんでしたが、RVMには以下のような機能もあります。

  • 複数のRubyでRakeタスクを実行する
  • 複数のRuby でベンチマークをとる
  • 複数のRubyでプロファイルをとる
  • GemSetsのインポート/エクスポート

RVM は英語ではありますがドキュメントがしっかししているので、http://rvm.beginrescueend.com/を確認してみましょう。

ぜひRVMを使って、たのしいRuby Lifeをエンジョイしてください。

おすすめ記事

記事・ニュース一覧