rubyは他の言語と比較してバージョンによる差異が大きく、異なるバージョンのrubyを使用している複数のプロジェクト業務をあるPCで行う場合に、プロジェクト毎に適切なバージョンのrubyを有効化および実行する必要が発生します。この要求はrbenvというツールを使用することで満たすことができます。つまり、rbenvは複数バージョンのrubyが同一システム内に共存することを可能にします。
rubyのライブラリであるgemについてもバージョンによる差異が大きいものがあり、異なるバージョンのgem (rails等) を使用している複数のプロジェクト業務をあるPCで行う場合に、プロジェクト毎に適切なバージョンのgemを有効化および実行する必要が発生します。この要求はbundlerというツールを使用することで満たすことができます。つまり、bundlerは複数バージョンのgemが同一rubyに対して共存することを可能にします。
システムにはrubyとgemがそれぞれインストール済みであると仮定して話を進めていますが、インストールされていなくても手順としては同じです。
rbenvはホームディレクトリ内にインストールします。つまり、同一PCを使用する他のユーザに影響を与えることがありません。具体的な手順としては、yum等のパッケージ管理ツールは使用せず、以下のようにgitレポジトリをクローンします。rbenvのプラグインとしてruby-buildもクローンしておくのを忘れないでください。rbenv自体にはインストール済みのrubyを管理する機能しかなく、ruby-buildでrubyをインストールする機能を追加する必要があります。
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ mkdir ~/.rbenv/plugins
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
クローン後は「~/.bashrc」等にrbenv用の設定を追記します。
~/.bashrc
export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"
追記したら
$ source ~/.bashrc
によって設定を反映させましょう。
「/usr/local/rbenv」にシステムインストールする手順については、こちらを参照してみてください。
rbenvはその動作のためにいくつかのソフトウェアに依存しているため、それらをシステムのパッケージ管理ツール (yum,homebrew等) でインストールする必要があります。
$ sudo yum install gcc
$ sudo yum install openssl-devel
$ sudo yum install readline-devel
インストール可能なrubyの一覧を表示してみましょう。
$ rbenv install -l
例えば「2.0.0-p481」のrubyをインストールしたい場合は以下のコマンドを実行します。
$ rbenv install 2.0.0-p481
$ rbenv rehash
インストールが正常に完了したら、確かにインストールされていることを確認してみましょう。
$ rbenv versions
* system (set by /home/username/.rbenv/version)
2.0.0-p481
システムにインストールされていたrubyの他に、先程インストールしたバージョンのrubyが存在しています。「*」が付いているものが有効化されているrubyです。「system」から「2.0.0-p481」に切り替えるためには以下のようにします。
$ rbenv global 2.0.0-p481
戻すためには
$ rbenv global system
とします。ある特定のディレクトリにおいて自動的に有効なバージョンが切り替わるようにするためには
$ rbenv local system
とします。「.ruby-version」というファイルが生成されるだけです。内容もシンプルで
$ cat .ruby-version
system
となっています。なお、rbenvでバージョンを切り替えると、rubyだけでなくgemコマンドのバージョンも対応したものに自動で切り替わりますので、改めてgemコマンドのバージョンを切り替える必要はありません。
gemコマンドでインストールするにせよ、bundleコマンドでインストールするにせよ、インストールされたgemパッケージはruby毎に管理されます。同一ruby内で異なるバージョンのgemパッケージを共存させることができるかどうかというところに、gemコマンドとbundleコマンドの違いがあります。
ややこしいですが、bundleコマンドはgemコマンドでインストールします。"rbenv exec" は「システムrubyのgem」ではなく「rbenvで現在有効なrubyのgem」であることを明記する表記です。"gem" がrbenvで有効なrubyのgemを指している場合は省略可能ではあります。
$ rbenv exec gem install bundler
$ rbenv rehash
これで、以下のコマンドで確認される通り、rbenvで有効なrubyについてbundlerというgemパッケージがインストールされました。
$ rbenv exec gem which bundler
/home/username/.rbenv/versions/2.0.0-p481/lib/ruby/gems/2.0.0/gems/bundler-1.7.2/lib/bundler.rb
あるいは以下のコマンドでもよいです。
$ rbenv exec gem list | grep bundler
bundler (1.7.2)
設定ファイルを作成します。コマンドは、bundlerではなくbundleです。
$ rbenv exec bundle init
システムrubyのgemパッケージにbundlerは存在しないため、"rbenv exec" で明記する必要も薄く
$ bundle init
とすることが多いです。生成された設定ファイルを編集します
$ vi Gemfile
Gemfile
# A sample Gemfile
source "https://rubygems.org"
gem "rails", "4.0.2"
以下のコマンドで、Gemfileにしたがい「./vendor/bundle」内にrailsをインストールします。
$ bundle install --path vendor/bundle
確かに、railsがインストールされていることが確認できます。
$ bundle exec rails new myApp --skip-bundle
なお、上の例のように、bundleでインストールした「./vendor/bundle」内のgemパッケージを利用する際には「bundle exec」というプレフィックスが必要です。また、「--skip-bundle」というオプションを指定しないとrbenvで現在有効なrubyに対してrailsがインストールされてしまいます。railsインストールは「./vendor/bundle」内に留めたいので、このオプションを忘れないようにしましょう。以上でrailsのローカルディレクトリ「./vendor/bundle」へのインストールは完了です。イメージとしては、「rbenv ∋ rubyおよびgem ∋ bundler ∋ rails」という関係にあります。