前回は、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をエンジョイしてください。