Ruby
AdventCalendar
開発環境

OS X で rbenv を使って ruby 1.9.3 or 2.0.0 の環境を作る

More than 5 years have passed since last update.

こんにちは、7日の予定が2日ほど遅延しております、すいません。

さて、私は OS X で ruby 1.9.3 の環境を構築するネタで書きたいと思います。


今回使う物



  • homebrew


    • readline

    • libyaml (2.0.0なら不要)

    • openssl

    • (trunk をビルドする場合) autoconf



  • rbenv


  • ruby-build


  • Command Line Tools (Xcode)


尚、環境は Xcode 4.5 + OS X Mountain Lion を想定しています。


準備

最近の Xcode, 4.3 からは Xcode.app のなかに Developers ディレクトリが入ったためターミナルから gcc とか叩いても

見つからないと言われます。なので Command Line Tool をインストールしましょう。

Command Line Tool, 入れる方法は 2 通りあります:


  • Xcode の環境設定からダウンロードしてインストールする


  • developer.apple.com の Downloads (要 Apple ID でのログイン) から dmg を取ってくる

後者の方が Obj-C とか使って OS X, iOS 開発しない人には容量的にお得だと思います。私は Xcode も入れて dmg から CLI tools 入れてるけど。

C コンパイラ等コマンドラインのツール、Ubuntu / Debian でいう build-essentials パッケージみたいなのが欲しい場合は Xcode.app を入れずに CLI tools だけ直接DLしてインストールすれば容量の節約になります。


homebrew

パッケージマネージャとして homebrew をインストールします。

何故 homebrew が必要かというと、openssl を入れるためです。OS X に添付された openssl は何かがおかしいようで、例えば net/https 使おうとすると SEGV したりする事があるようです。

$ /usr/bin/ruby -e "$(/usr/bin/curl -fsSL https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb)"

mxcl/homebrew installation page にあるようにインストールします。スクリプトが不安なら URL 踏んで確認するといいと思います。

/usr/local 下にデフォルトではインストールされるみたいです。私は ~/brew に入れるため git clone https://github.com/mxcl/homebrew.git ~/brew したりしています。


openssl を入れる

OS X に標準添付されている openssl は何かがおかしいのか、SEGV を引き起こす事があるため homebrew で入れ直します。

$ brew install openssl

終わり。


readline を入れる

OS X 標準添付の readline は readline もどきで、実態は libedit とかいう別の物です。readline もあわせて入れてしまいましょう。

$ brew install readline


libyaml を入れる

標準添付ライブラリの yaml パーサーの psych に必要な物です。ruby-build が入れてくれた気がしますが brew で入れています。trunk とか ruby-build 使わずに build してるというのもあるけど。

$ brew install libyaml

ただし、2.0.0 には libyaml がバンドルされているので入れなくても大丈夫です。


autoconf を入れる

開発版, trunk (HEAD) をインストールする時に必要です。(使わないなら入れなくても問題ない)

$ brew install autoconf

(autoconf も Xcode 4.3 で消えた…)


rbenv + ruby-build を入れる

ruby のバージョン管理システムとして rbenv を使い、

自動で ruby をビルドするために ruby-build を使います。

rvm という選択肢もありますが、rbenv の README にも書いてあるように以下の点で rvm はトラブルの元になりやすいです。



  • rvm でインストールした ruby を使うためにはシェルに rvm のスクリプトを読み込んでおく必要があります。 rbenv はスクリプトを読み込まずとも ~/.rbenv/shims 等に PATH を通せば使えます。cron 等で楽ですね。


  • cd 等のコマンドをオーバーライドしません。 たぶん rvm の一番のトラブルメーカーでしょう。


  • 設定ファイルがない! どの ruby を使いたいか以外、rbenv の設定がない。複雑じゃなくて良い。


  • ruby をインストールする機能がない。 rvm とは違って自分で ./configure して make, make install する事もできます。ruby-build で当然自動インストールもできます。 (自分でtrunkビルドしたり configure オプション弄ったりしてる人には重宝)


  • gemset がないです。 rvm の gemset は bundler が普及した今もはや必要無いと思う... これもトラブルメーカーかな


  • 黒魔術使ってないので特に考えずに使えます rvm は rvm への互換性のためになんか考慮する必要があるらしい? まあ、$PATH に入れるだけで使えるのは強み。


  • ディレクトリ推移した時にバージョンを切り替えても警告しません。 cd とかオーバーライドされるより自分はマシと考えるけどどうなんだろう。

とりあえず rvm がゴミという事を理解していただけたとは思います。入れましょう。

homebrew でも入れられるらしいけど自分で git clone して持ってくるのが速いでしょう。

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

$ mkdir -p ~/.rbenv/plugins
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

の後、以下の二行をお手持ちのシェルの rc ファイルに書きます (zshrc とか bashrc とか。zsh と bash 以外で動くかは知らないです)

export PATH="$HOME/.rbenv/bin:$PATH"

eval "$(rbenv init -)"

で、シェルを再起動するか source ~/.zshrc とかするか上の二行をシェルでも実行するかして反映させておきます。


Ruby を入れる

2.0.0 か 1.9.3 を入れます。1.8.7 は既に通常のバグフィックスリリースが終了していますし入れる理由はないんじゃないでしょうか。

というのは半分以上冗談じゃなくて、Xcode 4.3 から gcc が消え、llvm-gcc もしくは clang (どちらも LLVM 利用) の2つしかコンパイラが用意されていません。

ちなみにそれまではいつのまにか gcc が llvm-gcc へのシンボリックリンクになり、gcc は gcc-4.2 と指定しないと呼び出せなくなった。そして消えた。

で、残念ながら llvm-gcc, clang 両方で 1.8.7 のビルドは厳しいようで、入れるなら Xcode 4.2 持ってくるか osx-gcc-installer 使うか自分で gcc ビルドするかする必要があります。

(最適化を切ったりすれば行けるのかもしれんが、まぁ今更入れる理由なんて無いよね。素直に 1.9 を使おう!)

記憶してる限り 1.9.3 では clang, llvm-gcc 両方で普通にビルド可能で、1.9.2 だと llvm-gcc だとなんかおかしい、という感じです。clang 安定ですね。

尚、OS X Lion では未だに標準バンドルされている ruby が 1.8.7 です。残念ですね... Mountain Lion でどうなっているのか知りたい。


ruby-build を使う

$ RUBY_CONFIGURE_OPTS="--enable-shared --with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl) --with-libyaml-dir=$(brew --prefix libyaml)"  rbenv install 1.9.3-p448

$ RUBY_CONFIGURE_OPTS="--enable-shared --with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 2.0.0-p0
$ rbenv shell 1.9.3-p448


自分でビルドする

prefix に $HOME/.rbenv/versions/1.9.3-p448 のように指定してインストールします。versions の下に作るディレクトリ名は自分で決められて、その名前がバージョン切替時とかに渡す

名前になる。$HOME/.rbenv/versions/foo なら rbenv shell foo とかで切り替える事になる。

(trunk をインストールする例。rbenv でも 2.0.0-dev でインストールできるけど...)

$ git clone https://github.com/ruby/ruby.git

$ cd ruby
$ autoconf
$ mkdir build
$ cd build
$ ../configure --prefix=$HOME/.rbenv/versions/trunk --with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)
$ make -j5
$ make install
$ rbenv shell trunk


Tips


だいたいのところで使えるようにしておく

OS X なら /etc/paths/Users/<ユーザ名>/.rbenv/shims を先頭に書いておけば

だいたいの場面で自動で ruby やインストールしたコマンドへ $PATH が通るのでお勧めです。(rbenv コマンドへは通らないのでシェルの設定はあったほうが良い)


rbenv rehash

注意として、gem install などでコマンドがインストールされても rbenv rehash しないといけません。(ただ、下手にラッピングされるよりマシ)

$ gem i rails

$ rails -v
zsh: command not found: rails
$ rbenv rehash
$ rails -v
Rails 3.2.3


まとめ

rvm 捨てろ