bundlerを使うとRubyアプリケーションごとに閉じたgemの依存関係を構築できるので、gemのバージョンの違いや環境ごとの違いで悩まされることが減ります。
これは非常に便利なのですが、rakeやunicornのようにコマンドをインストールするgemの場合、
1 % bundle exec unicorn
のように、bundle exec
を介して実行する必用があって面倒です。
しかし、rvmを使えばこれを賢く解決できます。
比較的新しめのrvmとbundlerが必用になるので、
あらかじめ最新版をインストールしておいてください。
まず、以下のように適当なアプリケーション名などでgemsetを作ります。
1 % rvm gemset create foo-app
作成したgemsetは
1 % rvm gemset use foo-app
のようにしてアクティベートできます。新規に作成したgemsetの中身は
こんな感じになっています。
1 % gem list
2
3 *** LOCAL GEMS ***
4
5 bundler (1.0.2)
6 rake (0.8.7)
bundler-1.0.2はちょっと古いので、gem udpate
して最新のbundlerにします。
この状態であらかじめ用意しておいたGemfileに従ってgemをインストールします。
1 % bundler install --system
これで foo-app gemset にはGemfileで指定したgem群が入った状態になり、rake, unicornなどのコマンド群もrvmがいい感じに取り計らってくれます。
あとは、rvm gemset use xxx
を使えば適宜必用なgem環境を切り替えることができます。
ただ、アプリケーションが複数ある場合に、頻繁にgem環境を切り替えるのは面倒です。
アプリケーションのrootディレクトリに .rvmrc というファイルを作って
1 rvm use ruby-1.8.7-p302@foo-app
のように記述しておいておくと、cd した時にrvmが勝手にgemsetを切り替えてくれます。これで完璧ですね!
Bye bye gem hell!