RVM の Gem Sets で gemset の管理


RVM では gemset を複数持つことが出来、 Gem Sets(gemsets) で管理する。

  • 勝手な用語解釈
gemset
gem list で表示される様な gem一式に 名前を定義したもの

gemset を作成し 使用する

  • gemset の一覧を見る
$ rvm gemset list

gemsets for ruby-1.9.2-p136 (found in /home/User/.rvm/gems/ruby-1.9.2-p136)
global

デフォルトでは 'global' という gemset が用意されている。これは、
RVM で 使用している Ruby のバージョン毎に、共通の gem を インストール
するための gemset。$GEM_PATH を見ると、

$ echo $GEM_PATH
/home/User/.rvm/gems/ruby-1.9.2-p136:/home/User/.rvm/gems/ruby-1.9.2-p136@global

と、対象の Ruby のバージョン(上記の場合 ruby-1.9.2-p136) の
gemディレクトリリストの最後で 'global' を読み込むようになっている。

  • 現在使用中の gemset を確認する
$ rvm gemset name

何の gemset も使用されていない。(デフォルトでは、上述の
~/.rvm/gems/ruby-1.9.2-p136 という @ がないディレクトリの gem が
読み込まれるのだが、rvm gemset use で 指定することが出来ない。
以前の RVM のバージョンでは指定出来たらしい。) とりあえず、

  • gemset 'global' を使用するように指定する。
$ rvm gemset use global
Now using gemset 'global'
$ rvm gemset name
global

これで 'global' が使用される、が、テスト用に

  • gemset 'test1' を作成し 使用する。
$ rvm gemset create test1
'test1' gemset created (/home/User/.rvm/gems/ruby-1.9.2-p136@test1).

$ rvm gemset list

gemsets for ruby-1.9.2-p136 (found in /home/User/.rvm/gems/ruby-1.9.2-p136)
global
test1

$ rvm gemset use test1
Now using gemset 'test1'

$ rvm gemset name
test1

これで 'test1' が使用される。$GEM_PATH を見ると、

$ echo $GEM_PATH
/home/User/.rvm/gems/ruby-1.9.2-p136@test1:/home/User/.rvm/gems/ruby-1.9.2-p136@global

先程と同様に、最後に 'global' が読み込まれる。

gem をインストール

RubyGems で nokogiri をインストール
  • インストール済みの gem を見る
$ gem list

*** LOCAL GEMS ***

rake (0.8.7)
rubygems-update (1.4.2)

また rake と rubygems-update しかインストールされていない。('global'
にインストールされている)

  • インストールされていない Nokogiri の動作確認
$ ruby -rnokogiri -e "p Nokogiri::XML(%Q{<a b='c'/>}).at('a')['b']"
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- nokogiri (LoadError)
        from <internal:lib/rubygems/custom_require>:29:in `require'

当然エラー。

  • nokogiri をインストール
$ gem install nokogiri --no-ri --no-rdoc
Building native extensions.  This could take a while...
Successfully installed nokogiri-1.4.4
1 gem installed

$ gem list

*** LOCAL GEMS ***

nokogiri (1.4.4)
rake (0.8.7)
rubygems-update (1.4.2)

インストールされた、か?

  • Nokogiri の動作確認
$ ruby -rnokogiri -e "p Nokogiri::XML(%Q{<a b='c'/>}).at('a')['b']"
"c"

成功。インストールされている。

現在の gem一式を 別の gemset に コピーする

export, import を使う

現在の gemset 'test1' は テスト用で、Nokogiri を常に使える状態に
したいので、'test1' の gem一式を gemset 'global' にコピーする。

  • 現在使用中の gemset にインストールされている gem の一覧を出力
$ rvm gemset export test1.gems
Exporting current environments gemset to test1.gems

出力ファイル(上記の場合 'test1.gems') を指定しない場合 default.gems
に出力される。内容は gem の名前とバージョンの一覧が記載されている。

  • gemset 'global' に切り替える。
$ rvm gemset use global
Now using gemset 'global'

$ gem list

*** LOCAL GEMS ***

rake (0.8.7)
rubygems-update (1.4.2)

$ ls `rvm gemdir`/gems/
rake-0.8.7/  rubygems-update-1.4.2/

まだ rake と rubygems-update だけがインストールされている状態。

  • gem の一覧を インポート
$ rvm gemset import test1.gems 

Installing gems listed in test1.gems file...

installing nokogiri 1.4.4...
nokogiri 1.4.4 installed.

Processing of test1.gems is complete.

$ gem list; ls `rvm gemdir`/gems

*** LOCAL GEMS ***

nokogiri (1.4.4)
rake (0.8.7)
rubygems-update (1.4.2)
nokogiri-1.4.4/  rake-0.8.7/  rubygems-update-1.4.2/

nokogiri が 'global' にインストールされた。

  • Nokogiri の動作確認
$ ruby -rnokogiri -e "p Nokogiri::XML(%Q{<a b='c'/>}).at('a')['b']"
"c"

成功。


'test1' は用済みなので

  • gemset 'test1' を消去
$ rvm gemset delete test1
Are you SURE you wish to remove the entire gemset directory 'test1' (/home/User/.rvm/gems/ruby-1.9.2-p136@test1)?
(anything other than 'yes' will cancel) > yes

$ rvm gemset list

gemsets for ruby-1.9.2-p136 (found in /home/User/.rvm/gems/ruby-1.9.2-p136)
global

'test1' が消去された。

copy を使う

単純に コピーだけなら、

$ rvm gemset create test2
'test2' gemset created (/home/User/.rvm/gems/ruby-1.9.2-p136@test2).

$ rvm gemset copy 1.9.2-p136@global 1.9.2-p136@test2
Copying gemset from 1.9.2-p136@global to 1.9.2-p136@test2
Making gemset for 1.9.2-p136@test2 pristine.

$ rvm gemset use test2
Now using gemset 'test2'
$ gem list

*** LOCAL GEMS ***  

nokogiri (1.4.4)
rake (0.8.7)
rubygems-update (1.4.2)

と出来るらしい。