rvm 入門 … 複数バージョンの Ruby と Rails を混在させる
2011-05-21
そろそろ 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.7 | ruby-1.8.7の安定版をインストールする |
rvm install 1.9.2 | ruby-1.9.2の安定版をインストールする |
rvm 1.8.7 | ruby-1.8.7の環境に切り替える (rvm use 1.8.7の短縮形) |
rvm 1.9.2 | ruby-1.9.2の環境に切り替える (rvm use 1.8.7の短縮形) |
rvm system | 標準(rvm管理外)のruby環境に戻す (rvm use systemの短縮形) |
rvm info | 現在選択されているrubyの環境情報を表示する |
rvm uninstall 1.8.7 | ruby-1.8.7をアンインストールする |
Gemの環境切り替え
コマンド | 動作 |
rvm gemset list | 設定されているgemsetの一覧を表示 |
rvm gemset create rails30 | 「rails30」という名前のgemsetを作成 |
rvm gemset create rails31 | 「rails31」という名前のgemsetを作成 |
rvm 1.9.2@rails30 | ruby-1.9.2にて「rails30」という名前のgemsetへ切り替える |
rvm 1.9.2@rails31 | ruby-1.9.2にて「rails31」という名前のgemsetへ切り替える |
rvm gemset delete rails30 | 「rails30」という名前のgemsetを削除 |
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 などのコマンドも普通に使うことができて便利。