ぱろっと・すたじお

技術メモなどをまったりと / my site : http://parrot-studio.com/

今さらRVMの使い方をまとめてみる

RVM(Ruby Version Manager)はその名の通り、
複数存在するRubyのバージョンを切り替えるためのツールです*1


Rubyは1.9系と1.8系でいろいろ動作が異なるため、
複数のシステムを開発していると別々の環境が必要になることもありますが、
RVMを使うと環境構築から切り替えまでが簡単にできるのです(`・ω・´) b


私も昨年から使ってはいたものの、
ちょうどRuby1.9.2-p136に切り替えるためにRVM環境をいじったので、
ついでにメモを残しておきます


なお、「貴様の文章は毎度長すぎて読む気がしないんじゃщ(゚Д゚щ) 」という方は、
こちらの紹介記事を読んでもらった方が


Ruby Freaks Lounge:第39回 RVM(Ruby Version Manager)による環境構築|gihyo.jp … 技術評論社
Ruby Freaks Lounge:第40回 RVM(Ruby Version Manager)による環境構築(2)|gihyo.jp … 技術評論社

インストール


http://rvm.beginrescueend.com/rvm/install/

  1. tarballから
  2. Gitから
  3. (rubyの)gemから

3番目の方法が一番楽ですが、
すでに一つでもrubyが動いていることが前提になります
とはいえ、これを読んでいる方だと3番目の方法ですよね

(sudo) gem install rvm
rvm-install


これで ~/.rvm/ というpathが作られ、
この下に環境が作られていくことになりますが、
このままだと元々のrubyを見にいってしまいます


そこで、シェルの環境を書き換える必要がありますが、
rvm-installの際に書く内容が流れてきますので、
それに従って書き直してください


ちなみに、私のMac環境(.bash_profile)ではこうなってました

[[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm


公式の記述と違いますが、動いてるので気にしない( ゚Д゚)y─~~


<追記@2011/03/08>
どうもRVM1.2.7にはrvm-installコマンドが存在しないようです
以下のページを参考に、環境を構築してください
たぶん、gitが必要です


http://rvm.beginrescueend.com/rvm/install/

mkdir -p ~/.rvm/src/ && cd ~/.rvm/src && rm -rf ./rvm/ && git clone --depth 1 git://github.com/wayneeseguin/rvm.git && cd rvm && ./install

</追記>

rubyのインストール

rvm list known       # インストール可能なrubyの一覧

rvm install 1.9.2    # 1.9.2の最新版を入れたい場合
rvm install 1.8.7-p0 # あえて1.8.7-p0を指定するとか


<追記@2011/03/03>
ここでいう「最新」とは、RVMが情報を持っている中での最新です
つまり、「rvm list known」したときデフォルトになっているものです
これを書いている時点での最新版、RVM1.2.8の場合、1.9.2はp180を指します
</追記>


「rvm install」を実行すると、公式サイトからソースを落としてきて、
コンパイルからインストール、gemのインストールまで、
全自動でやってくれますヽ(`・ω・´)ノ


ただしMacOS(Snow Leopard)の場合、
デフォルトではreadlineにPATHが通ってないため、
そのままインストールするとirbで日本語が文字化けします


そこで、MacPortsで先にreadlineをインストール*2した上で、
インストール時に以下のコンパイルオプションを渡してください
(他のオプションも同じように渡せます)

# 1.9.2-p136の例
rvm install 1.9.2-p136  -C "--with-opt-dir=/opt/local"


<追記@2011/04/13>
Homebrewの場合については以下に書きました(´・ω・)っ
Homebrew+RVMでreadline/iconvを使う - どっかのBlogの前置きのような
</追記>

環境の切り替え方

rvm list         # インストール済みのrubyリスト
rvm use 1.9.2    # 1.9.2の最新版環境へ切り替え
rvm use system # gem経由でインストールした場合の元のruby


「rvm use」だけでruby関係一式が切り替え可能です
gemやirb等のコマンドも全て当該バージョンのものに変わります(`・ω・´) b


当然rakeもバージョンに応じたものに変わるので、
rdgc-dmをリリースする際は1.8.7/1.9.1/1.9.2に切り替えつつ、
それぞれのrakeからspecを走らせることで、互換性を担保しています*3


毎回「rvm use」を使うのも面倒って場合は、
シェル起動時のデフォルト指定も可能です

rvm use 1.9.2-p136 --default


一度実行すれば、次回のシェル起動時も同じ環境で立ち上がります
(インストール直後のdefaultはsystem)


同様に、rubyのバージョンを固定したまま、
gem一式を変更することができます

rvm gemset list # 現在のバージョンで使われているset一覧
# デフォルトではglobal

rvm gemset create rails2    # rails2.x用gem環境
rvm gemset use rails2       # rails2環境に切り替え
gem install rails -v "<3.0" # rails2をinstall

# rails3も同様
rvm gemset create rails3
rvm gemset use rails3
gem install rails

# 後は各gem環境ごとに必要なgemを

# rvm useからgemsetを指定することも
rvm use 1.9.2@rails2        # 1.9.2のrails2gemsetを指定

これならgemの混在も怖くないですね(`・ω・´) *4

rubyのupdateに対応する


そしてここからが今回私がやった作業ですが、
年末にruby1.9.2-p136が出ていたので、
ruby1.9.2-p0環境から移行することにしました


手順としては、まずrvm自身をupdateします

# 以下の手順のどちらか

# 1. systemのgemごとupdate
rvm use system
rvm update # 環境によってはsudoがいるかも?

# 2. systemを使わずリポジトリから
rvm get head


# 最新環境を読み込み(どちらの場合も必要?)
rvm reload


次に、最新のruby1.9.2を入れます

rvm install 1.9.2-p136 # -p136はつけなくてもOK
# Macの場合は -C "--with-opt-dir=/opt/local" を忘れずに


一度オプションをつけ忘れたままinstallしてしまい、
入れ直すはめになったので、皆さんは気をつけてください(´・ω・`)


で、このままだとgemの環境が移行できてません
ですので、元のgem環境をexportして、
新環境でimport/installという手順を踏みます

rvm use 1.9.2-p0   # 元の環境
rvm gemset export  # default.gemsetsファイルが作られる

rvm use 1.9.2-p136 # 新環境
rvm gemset import default.gemsets # gem一式のインストールが始まる

rvm use 1.9.2-p136 --default      # 必要ならば


.gemsetsファイルの実体はただのテキストで、
gem名+バージョンがずらっと並んでいるだけです


・・・と、ここまでやったところで、「rvm upgrade」というコマンドを発見
たぶん「rvm upgrage 1.9.2」とかやれば、
gemごと移行できそうですΣ(・ω・ノ)ノ


この場合、コンパイルオプション指定が怪しいという問題がありそうですが、
upgradeを先に試した方がいいかもしれません


<追記@2011/03/03>
1.9.2-p180が出たので、upgradeをやってみました

rvm upgrade 1.9.2-p136 1.9.2-p180

インストールからgemの移行までやってくれます(`・ω・´) b
必要であれば、古いパッチレベルのRubyは削除してもらうこともできます


ただ、予想通りMacのreadlineには対応できなかったので、
コンパイルオプションが必須のMacの場合、
一度upgradeしてから上書きでinstallが必要です(gemは引き継がれます)
</追記>

MySQLとの絡み


以前RVMの記事を書こうとしたときに、このネタをメモするつもりだったことを、
ここまで書いてから気づきましたΣ(゚Д゚)ガーン


rvmで環境はできたものの、
mysqlのgemが入らない、という問題に出くわすことがあります
(もちろん、MySQLはインストール済みで、mysql_configにPATHが通っている)


以前これで猛烈に悩んだのですが・・・


http://rvm.beginrescueend.com/integration/databases/


・・・ここに答えが書いてありました


つまり、rvmでinstallされるrubyは64bit版なので、
MySQL側も64bit版がいりますよ・・・と
32bit版を入れている方は入れ直しが必要です

本番でも使える?


あくまで個人的に・・・ですが、
RVMは開発環境向けだと思ってます


本番で複数のバージョンを使いたい場合、
例えば /usr/local/ruby192 /usr/local/ruby187 のように、
インストール先を変えて対応すべきかなと


そもそもrvm-installは実行ユーザの環境を使うため、
Passenger等のAPサーバからの参照としては微妙だとは思いますが、
一つの手段としてはありなのかな・・・?


<追記@2011/03/20>
自宅のサーバをさくらに移転した際、
サーバにRVMを入れたところ、非常に混乱しましたΣ(゚Д゚;≡;゚д゚)


gemのPATHをRVMが横取りする関係で、
gem installがうまくいかず、混乱する可能性がありますので、
やはり本番環境ではむやみに使わない方がいいかもしれません


少なくとも、構築用の作業アカウントには入れないように・・・
</追記>



というわけで、今回も長々書いてみましたが、
特に使い方に関しては、一番最初に紹介した記事にほとんど書いてあります


他にも複数の環境で同じコードをいっぺんにテストする*5とか、
いろいろな機能がありますので、
ぜひ元記事をチェックしてみてくださいね(`・ω・´)ノ

*1:Windows環境で同じようなことをしたい場合はこちらの「pik」を(´・ω・)っ https://github.com/vertiginous/pik

*2:MacPorts版のRubyを一度インストールするのが、関連するパッケージが全て入るので楽かもしれません

*3:RDGC本体も同じ方法でspecは通しているのですが、サポートとしては1.8.7です Exerbが1.9に対応するか、代替が見つかるまでは・・・

*4:一応、こういったgemのバージョン非互換を解決するためにbundlerって仕組みがあるわけですが・・・

*5:というか、いちいち切り替えなくても、その機能でrake specを走らせればいいんじゃ・・・