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.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 などのコマンドも普通に使うことができて便利。