rvm の設定あれこれ

Mac を新調したのを機に Ruby の環境も変えてみる。

今までは、Ruby野良ビルドしてコマンド名を変えて使い分けていた。

これをやめて rvm を使ってみる。

rvm とは

様々なバージョン、実装の Ruby をインストールして必要に応じて使い分けるためのシステム。

gem でもインストールできるらしいが、Ruby が先か gem が先か混乱するので、以下の記事を参考に git でインストール。

$ rvm install 1.9.2 -C "--enable-shared --enable-pthread --with-opt-dir=/opt/local"
$ rvm install 1.8.7 -C "--enable-shared --enable-pthread --with-opt-dir=/opt/local"
$ rvm install ruby-head -C "--enable-shared --enable-pthread --with-opt-dir=/opt/local"
$ rvm install jruby
$ rvm install macruby
$ rvm install rbx

調子にのっていっぱいインストールした。

デフォルトを指定しておく。これがログイン時に使える Ruby になる。

$ rvm use 1.9.2 --default

gem

gem はインストールした各 Ruby ごとにインストールする必要がある。

$ gem install rcodetools
$ rvm use 1.8.7
$ gem install rcodetools
$ rvm use jruby
$ gem install rcodetools
$ rvm use rbx
$ gem install rcodetools
    ...

めんどい。

rvm use すると、どうなるのか

環境変数を設定し直して、指定した Ruby が使えるようにする。

  • PATH
    • ~/.rvm/gems/RUBY/bin
    • ~/.rvm/gems/RUBY@global/bin
    • ~/.rvm/rubies/RUBY/bin
  • GEM_PATH
    • ~/.rvm/gems/RUBY
    • ~/.rvm/gems/RUBY@global
  • GEM_HOME

shebang

これまでは 1.9.2 をハードコーディングしていた。

#! /usr/local/bin/ruby19
# -*- coding: utf-8; -*-
    ...

せっかく rvm で Ruby を切り替えられるので、これからは env を使うことにする。

#! /usr/bin/env ruby
# -*- coding: utf-8; -*-
    ...

rcodetools

上記のパスを変更してやれば使えそう。

(defvar rvm-rubies
  '("ruby-1.9.2-p180"
    "ruby-1.8.7-p334"
    "ruby-head"
    "jruby-1.6.0"
    "macruby-0.9"
    "rbx-head"))

(defvar rvm-path-regex "\\(/\\.rvm/[^/]+/\\)\\([^/@]+\\)")


(defun rvm-path (ruby src-path)
  (let ((new-path nil))
    (mapcar '(lambda (path)
	       (setq new-path (cons (replace-regexp-in-string
				     rvm-path-regex
				     (concat "\\1" ruby) path) new-path)))
	    src-path)
    (reverse new-path)))

(defun rvm-use (&optional ruby)
  "rvm use"
  (interactive)
  (or ruby 
      (setq ruby (completing-read "rubies: " rvm-rubies nil t)))
  (setq exec-path (rvm-path ruby exec-path))
  (setenv "PATH" (mapconcat 'identity exec-path ":"))
  (setenv "GEM_HOME" (car (rvm-path ruby (list (or (getenv "GEM_HOME") "")))))
  (setenv "GEM_PATH"
	  (mapconcat 
	   'identity
	   (rvm-path 
	    ruby (split-string (or (getenv "GEM_PATH") "") ":")) ":")))

(provide 'rvm)
  • まずはデフォルト ruby-1.9.2
RUBY_VERSION        # => "1.9.2"
RUBY_PLATFORM       # => "x86_64-darwin10.7.1"
RUBY_DESCRIPTION    # => "ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.1]"

M-x rvm-use すると、どの Ruby を使うのか聞いてくる。

rubies: ruby-1.8.7-p334

上記 rvm-rubies の中から補完できる。

RUBY_VERSION        # => "1.8.7"
RUBY_PLATFORM       # => "i686-darwin10.7.1"
RUBY_DESCRIPTION    # => "ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10.7.1]"
RUBY_VERSION        # => "1.8.7"
RUBY_PLATFORM       # => "java"
RUBY_DESCRIPTION    # => "jruby 1.6.0 (ruby 1.8.7 patchlevel 330) (2011-03-15 f3b6154) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_24) [darwin-x86_64-java]"
  • rubinius
RUBY_VERSION        # => "1.8.7"
RUBY_PLATFORM       # => "x86_64-apple-darwin10.7.1"
RUBY_DESCRIPTION    # => "rubinius 1.2.4dev (1.8.7 6516032f yyyy-mm-dd JI) [x86_64-apple-darwin10.7.1]"
# >> "1.8.7"

なぜか勝手に puts RUBY_VERSION もしてくれるw

RUBY_VERSION        # => "1.9.3"
RUBY_PLATFORM       # => "x86_64-darwin10.7.1"
RUBY_DESCRIPTION    # => "ruby 1.9.3dev (2011-03-21 trunk 31140) [x86_64-darwin10.7.1]"
No such file or directory -- xmpfilter (LoadError)

動かなかった orz