at posts/single.html

rvm 入門 … 複数バージョンの Ruby と Rails を混在させる

そろそろ Ruby1.9 の時代だろうということで、MacBook Proで使う Ruby のバージョンを 1.9.2 へ移行することにした。 MacPort でもインストールしていたんだけど、いちいち ruby1.9 とか gem1.9 とか入力するのが面倒なので、 rvmを使って Ruby のバージョンを切り替えられるようにした。 さらに、 rvm を使うと複数バージョンの Rails を混在できるので、 Rails3.0 と Rails3.1 rc1 を混在させてみた。

ちょっと使ってみたけど、複数環境を自然に混在させることができるので、かなり便利。

rvm コマンドのまとめ

最初に(僕が)よく使うコマンドをまとめておく。 細かな使い方はこの後に書く。

Rubyのバージョン切り替え
コマンド動作
rvm list knownインストール可能なrubyバージョンの一覧を表示
rvm listインストールされているrubyバージョンの一覧を表示
rvm install 1.8.7ruby-1.8.7の安定版をインストールする
rvm install 1.9.2ruby-1.9.2の安定版をインストールする
rvm 1.8.7ruby-1.8.7の環境に切り替える (rvm use 1.8.7の短縮形)
rvm 1.9.2ruby-1.9.2の環境に切り替える (rvm use 1.8.7の短縮形)
rvm system標準(rvm管理外)のruby環境に戻す (rvm use systemの短縮形)
rvm info現在選択されているrubyの環境情報を表示する
rvm uninstall 1.8.7ruby-1.8.7をアンインストールする
Gemの環境切り替え
コマンド動作
rvm gemset list設定されているgemsetの一覧を表示
rvm gemset create rails30「rails30」という名前のgemsetを作成
rvm gemset create rails31「rails31」という名前のgemsetを作成
rvm 1.9.2@rails30ruby-1.9.2にて「rails30」という名前のgemsetへ切り替える
rvm 1.9.2@rails31ruby-1.9.2にて「rails31」という名前のgemsetへ切り替える
rvm gemset delete rails30「rails30」という名前のgemsetを削除

rvm

rvm のインストール

公式サイトの Installing RVMを参考に。 ちょっと変わったインストール方法になる。

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

Ruby のインストール

公式サイトのInstalling Rubiesを参考に。

rvm を使って Ruby の 1.8.7 と 1.9.2 の安定版をインストールする。 list knownコマンドでインストール可能なバージョン一覧を見る(以前は list --all)。

$ rvm list known
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.6-head
[ruby-]1.8.7[-p334]
[ruby-]1.8.7-head
[ruby-]1.9.1-p378
[ruby-]1.9.1[-p431]
[ruby-]1.9.1-head
[ruby-]1.9.2[-p180]
[ruby-]1.9.2-head
ruby-head

括弧 [] 部分は省略可能なので、例えば ruby-1.9.2-p180 は 1.9.2 で表される。 他にもJRubyやREEなどもインストールできる。

まずruby-1.8.7をインストールする。

$ rvm install 1.8.7
Installing Ruby from source to: /Users/machu/.rvm/rubies/ruby-1.8.7-p334, this may take a while depending on your cpu(s)...

ruby-1.8.7-p334 - #fetching 
ruby-1.8.7-p334 - #downloading ruby-1.8.7-p334, this may take a while depending on your connection...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 4092k  100 4092k    0     0  2220k      0  0:00:01  0:00:01 --:--:-- 2591k
ruby-1.8.7-p334 - #extracting ruby-1.8.7-p334 to /Users/machu/.rvm/src/ruby-1.8.7-p334
ruby-1.8.7-p334 - #extracted to /Users/machu/.rvm/src/ruby-1.8.7-p334
ruby-1.8.7-p334 - #configuring 
ruby-1.8.7-p334 - #compiling 
ruby-1.8.7-p334 - #installing 
Removing old Rubygems files...
Installing rubygems dedicated to ruby-1.8.7-p334...
Installing rubygems for /Users/machu/.rvm/rubies/ruby-1.8.7-p334/bin/ruby
Installation of rubygems completed successfully.
ruby-1.8.7-p334 - adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
ruby-1.8.7-p334 - #importing default gemsets (/Users/machu/.rvm/gemsets/)
Install of ruby-1.8.7-p334 - #complete 

同じように ruby-1.9.2 もインストールする。

$ rvm install 1.9.2
(以下省略)

どちらも $HOME/.rvm/rubies 以下にインストールされる。

$ ls -l $HOME/.rvm/rubies
total 0
drwxr-xr-x  6 machu  staff  204  5 22 15:46 ruby-1.8.7-p334/
drwxr-xr-x  7 machu  staff  238  5 20 22:42 ruby-1.9.2-p180/

$ ls -l $HOME/.rvm/gems
total 0
drwxr-xr-x  7 machu  staff  238  5 22 15:45 ruby-1.8.7-p334/
drwxr-xr-x  7 machu  staff  238  5 22 15:46 ruby-1.8.7-p334@global/
drwxr-xr-x  8 machu  staff  272  5 20 22:49 ruby-1.9.2-p180/
drwxr-xr-x  7 machu  staff  238  5 20 22:42 ruby-1.9.2-p180@global/
drwxr-xr-x  2 machu  staff   68  5 20 22:41 system/

Ruby バージョンの切り替え

インストールされているバージョンの一覧は、listコマンドを使って確認する。

$ rvm list

rvm rubies

   ruby-1.8.7-p302 [ x86_64 ]
   ruby-1.9.2-p0 [ x86_64 ]

バージョンを切り替えるには use コマンド。

$ rvm use 1.8.7
Using /Users/machu/.rvm/gems/ruby-1.8.7-p334

ちゃんと1.8.7に切り替わっていることを確認。

$ ruby -v
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10.7.0]

$ which ruby
/Users/machu/.rvm/rubies/ruby-1.8.7-p334/bin/ruby

標準の ruby とは別の環境になるので、 gem の一覧も空(bundlerとrakeは入るみたい)になっている。

$ gem list

*** LOCAL GEMS ***

bundler (1.0.0.rc.5)
rake (0.9.0)

gem コマンドを使うと、 .rvm の管理下にgemがインストールされる。

$ gem install rspec

$ which rspec
/Users/machu/.rvm/gems/ruby-1.8.7-p334/bin/rspec

$ gem list
*** LOCAL GEMS ***

bundler (1.0.0.rc.5)
diff-lcs (1.1.2)
rake (0.9.0)
rspec (2.6.0)
rspec-core (2.6.2)
rspec-expectations (2.6.0)
rspec-mocks (2.6.0)

次に1.9.2に切り替える。

$ rvm use 1.9.2
Using /Users/machu/.rvm/gems/ruby-1.9.2-p180

ちゃんと切り替わっていることを確認。

$ ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]

$ which ruby
/Users/machu/.rvm/rubies/ruby-1.9.2-p180/bin/ruby

Rubyのバージョンを変えたので、gemも切り替わっている。さっきインストールしたrspecがない。

$ gem list

*** LOCAL GEMS ***

bundler (1.0.0.rc.5)
rake (0.8.7)

標準の ruby に戻すには use system を指定する。

$ rvm use system
Now using system ruby.

元に戻っていることを確認。

$ ruby -v
ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin10]

$ which ruby
/opt/local/bin/ruby

ちなみに use コマンドは省略可能。

$ rvm 1.8.7
$ rvm 1.9.2
$ rvm system

シェルを起動したときに自動的に特定のバージョンを選択したいなら、--defualtオプションを付ける。

$ rvm --default 1.9.2
$ exit

再度シェルを起動すると、--defaultで指定したバージョンに切り替わっている。

$ ruby -v
ruby-1.9.2-p180

$ rvm list
rvm rubies
   ruby-1.8.7-p334 [ x86_64 ]
=> ruby-1.9.2-p180 [ x86_64 ]

--defaultの指定を無効し、OS標準のRubyを使うように戻すには、resetコマンドを使う。

$ rvm reset

1つのRubyバージョンで複数のRubyGems環境を混在させる。

ここまでで、複数バージョンの Ruby が混在できるようになる。 gem もそれぞれの Ruby のバージョンごとに管理されている。 でも、1つのRubyバージョンでは、1つのRubyGemsの環境。

さて、 rvm はRubyバージョンの混在だけでなく、複数のRubyGems環境を混在させる機能もある。 これを使うと、複数のRails環境を混在することができる。 公式サイトのNamed Gem Setsを参考に。

gemの集合はgemset という単位で管理される。 gemset listで一覧を表示できる。 標準では global という gemset が作られている。

$ rvm 1.8.7

$ rvm gemset list
gemsets for ruby-1.8.7-p334 (found in /Users/machu/.rvm/gems/ruby-1.8.7-p334)
   global

GEMの環境変数を見ると、「ruby-1.8.7-p334」と「ruby-1.8.7-p334@global」という2つのディレクトリが作られ、GEM_PATH環境変数に設定されていることが分かる。

$ gem env
RubyGems Environment:
  - RUBYGEMS VERSION: 1.6.2
  - RUBY VERSION: 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10.7.0]
  - INSTALLATION DIRECTORY: /Users/machu/.rvm/gems/ruby-1.8.7-p334
  - GEM PATHS:
     - /Users/machu/.rvm/gems/ruby-1.8.7-p334
     - /Users/machu/.rvm/gems/ruby-1.8.7-p334@global

$ echo $GEM_PATH
/Users/machu/.rvm/gems/ruby-1.8.7-p334:/Users/machu/.rvm/gems/ruby-1.8.7-p334@global

「ruby-1.8.7-p334@global」のディレクトリには、はじめからインストールされているbundlerとrakeのgemが含まれている。

$ ls ~/.rvm/gems/ruby-1.8.7-p334@global/gems
bundler-1.0.0.rc.5/     rake-0.9.0/

「ruby-1.8.7-p334」のディレクトリには、先ほどインストールした rspec の gem が含まれている。

$ ls ~/.rvm/gems/ruby-1.8.7-p334/gems
diff-lcs-1.1.2/                 rspec-2.6.0/                    rspec-expectations-2.6.0/
rake-0.9.0/                     rspec-core-2.6.2/               rspec-mocks-2.6.0/

つまり、標準では「ruby-1.8.7-p334@global」と「ruby-1.8.7-p334」に存在するgemが見える状態。

$ gem list

*** LOCAL GEMS ***

bundler (1.0.0.rc.5)
diff-lcs (1.1.2)
rake (0.9.0)
rspec (2.6.0)
rspec-core (2.6.2)
rspec-expectations (2.6.0)
rspec-mocks (2.6.0)

新しい gemset を作ってみる。同じディレクトリに「ruby-1.8.7-p334@test」が作成される。

$ rvm gemset create test
'test' gemset created (/Users/machu/.rvm/gems/ruby-1.8.7-p334@test).

gemset を切り替える。

$ rvm gemset use test

gem のディレクトリが「ruby-1.8.7-p334@global」と「ruby-1.8.7-p334@test」の2つに切り替わる。 つまり global に含まれるgemはgemset 共通で見えるということ。 一方、「ruby-1.8.7-p334」にインストールしたrspecは見えなくなってる。

$ gem env
  - GEM PATHS:
     - /Users/machu/.rvm/gems/ruby-1.8.7-p334@test
     - /Users/machu/.rvm/gems/ruby-1.8.7-p334@global

$ gem list

*** LOCAL GEMS ***

bundler (1.0.0.rc.5)
rake (0.9.0)

この状態でgemコマンドを使うと、ライブラリは「ruby-1.8.7-p334@test」ディレクトリにインストールされる。

gemset を含めた環境の切り替えは、gemset useコマンドだけでなく、useコマンドで@を使うことでも可能。

$ rvm 1.8.7
$ rvm gemset use test

上記のコマンドは以下のように1.8.7@test一発で切り替えられる。

$ rvm 1.8.7@test

複数Railsバージョンを混在させる

Ruby1.9.2の環境で、安定版のRails3.0と開発版のRails3.1 rc1を混在させてみる。 これで新しいバージョンの機能を安心して使うことができるね。

Ruby1.9.2へ切り替え。

$ rvm 1.9.2
$ rvm gemset list

gemsets for ruby-1.9.2-p180 (found in /Users/machu/.rvm/gems/ruby-1.9.2-p180)
   global

rails30とrails31という名前のgemsetを作成する。

$ rvm gemset create rails30
'rails30' gemset created (/Users/machu/.rvm/gems/ruby-1.9.2-p180@rails30).

$ rvm gemset create rails31
'rails31' gemset created (/Users/machu/.rvm/gems/ruby-1.9.2-p180@rails31).

$ rvm gemset list
gemsets for ruby-1.9.2-p180 (found in /Users/machu/.rvm/gems/ruby-1.9.2-p180)
   global
   rails30
   rails31

rails30のgemsetに切り替えて、Rails3.0をインストールする。

$ rvm 1.9.2@rails30

$ gem install rails
Fetching: activesupport-3.0.7.gem (100%)
Fetching: builder-2.1.2.gem (100%)
(中略)
Successfully installed bundler-1.0.13
Successfully installed rails-3.0.7
23 gems installed

次にrails31のgemsetに切り替えて、Rails3.1 RC1をインストールする。

$ rvm 1.9.2@rails31

$ gem install rails --pre
Fetching: multi_json-1.0.2.gem (100%)
Fetching: activesupport-3.1.0.rc1.gem (100%)
(中略)
Successfully installed bundler-1.0.13
Successfully installed rails-3.1.0.rc1

これで完了。 Rails3.0を使うときは 1.9.2@rails30を指定する。

$ rvm 1.9.2@rails30
$ ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]
$ rails -v
Rails 3.0.7
$ which rails
/Users/machu/.rvm/gems/ruby-1.9.2-p180@rails30/bin/rails

Rails3.1 RC1を使うときは 1.9.2@rails31を指定する。

$ rvm 1.9.2@rails31
$ ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]
$ rails -v
Rails 3.1.0.rc1
$ which rails
/Users/machu/.rvm/gems/ruby-1.9.2-p180@rails31/bin/rails

まとめ

rvmを使うと、複数のRubyバージョンを共存できる。 さらに、1つのRubyバージョン内でも複数のgemsetを切り替えて使うことができる。 rvm が環境変数 (PATH, GEM_HOME, GEM_PATHなど) をいい感じに切り替えてくれるので、 gem や irb などのコマンドも普通に使うことができて便利。

関連する日記