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 installGitHub - 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に変更しました