2011年10月19日水曜日

RVM を使って複数の Rails を使い分ける

Ruby/Rails の学習題材に openskip を選んだために、gem でインストールした rails のバージョンは 2.3.5 です。

どうせ勉強するなら最新の rails 3 での挙動も並行して勉強したいところです。そもそも仮想ゲストOS上の環境なのでもう一つ作るっていうのもありなんですが、手間がかかりそうとかリソースが足りなさそうとか思うと、現在の環境に複数バージョンを共存させたくなってきました。

そんなこんなで調べていたら rvm (Ruby Version Manager)というのを見つけました。

インストール

基本的に以下の文書にしたがって(略
http://beginrescueend.com/rvm/install/

まずは download & install :

$ sudo bash <<(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
これだけで /usr/local/rvm/ 以下にインストールが完了します。
また、インストールの際のログの中に
NOTE: To all Multi-User installers - DO NOT forget to add your users to  the 'rvm' group.
という注意がありました。「Linuxのグループをプロジェクトごとに使う」っていうポリシー自体は聞いたことがあったんですが、こういう形で使うのは初めてです。 ひとまず、自分のユーザを rvm グループに追加しました。
$ sudo usermod -a -G rvm kazu
あと、「Rubyの最新版を入れるんだったら…が必要だよ」とたくさん yum のパッケージが列挙してあったので、必要になるか微妙だったんですが、足りていなかった libyaml-devel, libffi-devel をインストールしました。

Ruby 環境の作成


以下のページを参考にさせてもらいました。
http://www.machu.jp/diary/20110521.html

rvm では
  • system (rvm の管理外のsystem標準の環境: OSパッケージのrubyやgems)
  • rvm 以下に複数のバージョンの ruby 
    • 各rubyのバージョン以下に(独立した)複数の gemset
というかたちで環境を作っていきます。

とりあえず(1.9系の良さを知らないもので…)1.8系で満足ですが、この際 1.9 も用意しておこうと思います。ということで、rvm にて、
$ rvm install 1.8.7
$ rvm install 1.9.2
で1.8系および1.9系をインストールしておきます。
(どんなバージョンが利用可能かは "rvm list known" で確認できます)

さて。
この状態だと、rvm管理下の 1.8.7 / 1.9.2 の2つの環境、およびOS標準(system)の合計3つの Ruby 環境があります。
これを切り替えるのには rvm use を使います。
1.8.7 環境に切り替える:
$ rvm use 1.8.7
元のシステム環境に戻す:
$ rvm use system

次は、"rvm use 1.8.7" を行った(一旦 rvm 環境下に入った)上で、gemset の作成に移ります。
$ rvm gemset create openskip
$ rvm gemset create rails3
作成したら rvm use コマンドで gemset を含めた指定を行います。
$ rvm use 1.8.7@rails3
ここで gem list コマンドを使ってみると空っぽの gem 環境になっていて、以前インストールした gem とは切り離されていることが分かるので、望みの gem を揃えていきます。
$ gem list

*** LOCAL GEMS ***

$ gem install rails3
これで複数環境を使い分けられそうです。

(追記: 2011/10/22)
openskip の環境を system じゃなくて ruby-1.8.7@openskip として作ったときに

/usr/local/rvm/gems/ruby-1.8.7-p352@openskip/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:55: uninitialized constant ActiveSupport::Dependencies::Mutex (NameError)
というエラーに見舞われました。
エラーメッセージをググったら、特定の rails のバージョンと rubygems のバージョンとの組み合わせで起こるエラーのようです。
http://blog.digital-squad.net/article/196968134.html

rvm の ruby-1.8.7@openskip 環境で、
$ gem -v
1.8.10
$ gem update --system 1.3.7
ちなみに gem のバージョンは < 1.6 であればいいようなんですが、OS標準の gem と同じバージョンにしてみました。

0 件のコメント:

コメントを投稿