一つのrubyでgemを使いわけたいときに使えるかもしれない方法の一つ

<2/22追記> もうコマンドの仕様がかわったので、以下のチュートリアルだとできないので注意な
あるRubyの環境で、gemが爆発するということがよくあると思います。また、勉強会とかでたときに、つかっている環境に必要でないgemをいれないといけないとか、gemのバージョンを固定したいのに別のバージョンをいれる必要があるとか。

そんなときに、rvmのgemsets機能なんかがよさげ。

ようは、gemをインストール、ロードするディレクトリを勝手に切り換えてくれる機能。

rvmのrubyでは、何もしないと以下のようなディレクトリのgemを使うことになります。

% rvm use ruby-1.8.7-p249
Now using ruby 1.8.7 p249

% rvm gems dir
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249
% echo $GEM_PATH
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249:/Users/takkanm/.rvm/gems/ruby-1.8.7-p249%global

ここにgemsetsというものを導入してみます。gemsetsは、複数のgemを管理する区切りの概念。
新しいgemsetsを作るには、こんなかんじ。

% rvm use ruby-1.8.7-p249
Now using ruby 1.8.7 p249
% rvm gems rails3gems

gems(et) : rails3gems

こうすると、ruby-1.8.7-p249に'rails3gems'というgemsetsがつくられます。
gemsetsのディレクトリは、こんなかんじで確認できる。

% rvm gems dir
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249%rails3gems

この状態でgemをインストールすると、このようにインストールされる。

% gem install rails3b
(以下略)
% gem install rails --pre --no-rdoc --no-ri
% ls `rvm gems dir`/gems
abstract-1.0.0/            activesupport-3.0.0.beta/  memcache-client-1.7.8/     railties-3.0.0.beta/
actionmailer-3.0.0.beta/   arel-0.2.pre/              mime-types-1.16/           text-format-1.0.0/
actionpack-3.0.0.beta/     builder-2.1.2/             rack-1.1.0/                text-hyphen-1.0.0/
activemodel-3.0.0.beta/    bundler-0.9.7/             rack-mount-0.4.7/          thor-0.13.3/
activerecord-3.0.0.beta/   erubis-2.6.5/              rack-test-0.5.3/           tzinfo-0.3.16/
activeresource-3.0.0.beta/ i18n-0.3.3/                rails-3.0.0.beta/
activesupport-2.3.5/       mail-2.1.2/                rails3b-3.0.1/

このときGEM_PATHは、こんなかんじになる。

% echo $GEM_PATH
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249%rails3gems:/Users/takkanm/.rvm/gems/ruby-1.8.7-p249%global

で、こんなかんじに別のgemsetを作る。

% rvm  ruby-1.8.7-p249%rails2gems
% rvm gems dir
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249%rails2gems
% gem install rails  --no-rdoc --no-ri
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
% ls `rvm gems dir`/gems
actionmailer-2.3.5/   activerecord-2.3.5/   activesupport-2.3.5/  rails-2.3.5/
actionpack-2.3.5/     activeresource-2.3.5/ rack-1.0.1/
% echo $GEM_PATH
/Users/takkanm/.rvm/gems/ruby-1.8.7-p249%rails2gems:/Users/takkanm/.rvm/gems/ruby-1.8.7-p249%global

これで、2つのgemsetができたので、i18nをrequireしてみて、GEM_PATHがちゃんと切り替えられるかを確認。

% rvm  ruby-1.8.7-p249%rails3gems
% irb
ruby-1.8.7-p249 > require 'rubygems'
 => true 
ruby-1.8.7-p249 > require 'i18n'
 => true 
ruby-1.8.7-p249 > quit
% rvm ruby-1.8.7-p249%rails2gems
% irb
ruby-1.8.7-p249 > require 'rubygems' => true 
ruby-1.8.7-p249 > require 'i18n'
LoadError: no such file to load -- i18n
	from /Users/m_mimura/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
	from /Users/m_mimura/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
	from (irb):2
ruby-1.8.7-p249 > quit

ちゃんと、切り替えられてますね。

デフォルトで'global'という、gemsetが常にGEM_PATHに入っているみたいなので、常に使うgemはこちらにいれるといいのかもしれないですね。

なんで、わたしがこれを調べだしたかというと、rails3とrails2のコマンドの共存を簡単にできないかなぁと思って調べていたわけですが。しかし、PATHを編集してくれていないので、使えないわけだなぁ。