rbenvとruby-buildとbundlerでRuby環境構築のメモ

GitHub - rbenv/rbenv: Groom your app’s Ruby environmentを使ってRuby環境を構築しました。Rubyは実質初めてなので、二の足を踏んだりよく分からず調べてばかりで、なかなか先に進まなかったりもしたけど、ようやく基本的な要素を把握出来た感じ。そんななので、細かく書きすぎてて若干くどいかもしれない。

rbenvのインストール

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

$ vi .bashrc
#rbenv
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

rbenv自体はこれでインストール完了。
ここで、Terminalを開きなおす等して、.barhrcを読み込ませる。

ruby-buildのインストール

$ ./configure --prefix=$HOME/.rbenv/versions/1.9.2-p290
$ make
$ make install
GitHub - rbenv/rbenv: Groom your app’s Ruby environment

ここにも書いてある様に、rbenvは切り替える機能は提供するけど、Rubyのインストールは自分で・・・というのは面倒なので、ruby-buildというプラグインを入れると、PerlbrewやPythonbrewのようにインストールも出来るようになります。

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

pluginsディレクトリに配置するだけ。
他にもGitHub - rbenv/rbenv-vars: An rbenv plugin that safely sets global and per-project environment variablesというプラグインもあるみたいだけど、必要になったら考えます。

$ rbenv install
usage: rbenv install VERSION
       rbenv install /path/to/definition

Available versions:
  1.8.6-p383
  1.8.6-p420
[以下略]

$ rbenv install 1.9.2-p320
$ rbenv install 1.9.3-p194
$ rbenv rehash

何も指定しなければ利用可能なバージョンが一覧に出て、バージョンを指定すればインストールが始まります。

Rehash rbenv shims (run this after installing binaries)

新しくRubyをインストールしたらrbenv rehashするものらしいです。何の効果があるのか、なんとなく想像はつくんですが、忘れててもちゃんと動いてる様な気も・・・。まぁちゃんと分かってないです。ruby-buildからのインストールなら、内部で実行済みなのかもしれない。

gemコマンド

$ gem --version
1.8.23
$ gem update --system
$ gem --version
1.8.24

RubyをインストールするとRubygemsも入ってます。バージョンが古い場合があるから、更新しておく。--systemを付けるとRubygems本体を更新する。systemって書かれると、OSに関わりのあるものを変えたりしそうな印象あるけど、selfとかじゃダメだったんだろうか。

$ gem install bundler

Ruby環境構築のエントリーで大抵最初に入れろと書かれてるBundler。詳しくは下記で。gemコマンドはBundlerを入れたたら、もうあまり使う事はないかも。

Bundler

Gem Bundler – Manage your Ruby gemsは、どうも知ってる前提でBundlerとは何かを書いてるエントリーが中々見つけられず、何となく分かるけど正確にはよく分からないやつって印象だった、自分の中でのちょっとした難所でした。

Bundlerとは

Gemfileというファイルに、使いたいgemを定義しておいてbundle installすると、そのgemが一括インストールされるというもの。その際bundle install --path vendor/bundleとオプションを指定すると./vendor/bundle/にgemをインストールできる。プロジェクト毎に使うgemを分けてインストールできるというもの。

bundle installだけでインストールすると、rbenvで入れたRubyなら例えば.rbenv/versions/1.9.2-p320/lib/ruby/gems/1.9.1/gems/にインストールされる。gemコマンドを使った場合も同様。これだと、同じgemだけど最新でも良いアプリと、ちょっと古いバージョンに依存したアプリを使ったり開発したりするのに困ってしまう。

このデフォルトのインストール先は$GEM_HOMEらしいけど、$GEM_HOMEにはBundlerだけ入れておいて、アプリやプロジェクト毎にbundleコマンドで必要なgemを持たせるというのがbundleの使い方らしい。

自分で作っているのも、Gemfileを書いてbundle install --path vendor/bundleして作り、そのままそのGemfileを含めて公開すれば、アプリを使う側も依存するgemをbundle install --path vendor/bundleで一括インストール出来て便利という事みたい。

使い方ざっくり

$ mkdir myapp;cd myapp
$ bundle init
Writing new Gemfile to /Users/myuser/Dev/myapp/Gemfile
$ vi Gemfile
# A sample Gemfile                                                                                  
source "https://rubygems.org"

# gem "rails"

雛形を作るbundle init

# A sample Gemfile                                                                                  
source "http://rubygems.org"

gem "rails"
gem "foo", "1.2.3"
gem "bar", ">=1.2.3"

どうもhttpsだと証明書の検証が通らない問題が出ているらしい。

$ bundle install --path vendor/bundle

どうやらvendor/bundle*1が推奨される置き場所らしい。

毎回 --path vendor/bundle書くのメンドクサイ
path "vendor/bundle"

Gemfileにこれ書いておけばbundle installでも./vendor/bundle/に入りました。これなら楽になりそう。これを書いてるエントリーが全然なくて、試しにやってみたら出来たんだけど、インストール先を強制するGemfileを同梱してアプリを配布しにくいからとかなのかな?

The path `/Users/myuser/Dev/myproject/vendor/bundle` does not exist.

./vendor/bundle/が存在しないと入れられませんでした。 --path vendor/bundleの方はディレクトリ作成もしてくれるんですよねぇ・・・

Gemfileを書く

Gem Bundler – Manage your Ruby gemsは中々分かりにくいのでhttp://www.milligramme.cc/wp/archives/3475とかが分かりやすいかも。

rbenvについてもうちょっと細かく

$ type ruby
ruby is /Users/myuser/.rbenv/shims/ruby

rbenvが動いているとrubyが変わったパスになってます。ファイルパスからはシステムRubyでもないし、rbenvで入れたRubyでもない様子。

$ ruby --version
ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin9]

どうやら実態はシステムRuby

$ rbenv global 1.9.2-p320
$ type ruby
ruby is /Users/myuser/.rbenv/shims/ruby
$ ruby --version
ruby 1.9.2p320 (2012-04-20 revision 35421) [i386-darwin9.8.0]

rbenvを通して使うRubyを設定すると、実際に動くRubyが変わる仕組みらしい。

global Set or show the global Ruby version
local Set or show the local directory-specific Ruby version
shell Set or show the shell-specific Ruby version

指定の方法は3つ。

$ rbenv local 1.9.2-p320
$ cat .rbenv-version
1.9.2-p320

globalとshellは良いとして、localがちょっと特殊です。実行したディレクトリに.rbenv-versionを作って、そこにRubyのバージョンが書いてあります。このファイルがあるディレクトリ内は、そのRubyが使われるというもの。

環境

rbenv 0.3.0

*1:Bundleのドキュメントにvendor/bundleとあったので、このエントリーでもvendor/bundlerからvendor/bundleに変更しました