一つの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を編集してくれていないので、使えないわけだなぁ。