Railsアプリの開発に bundler を使うようになって、gem 関連でハマることは少なくなったような気がします。ただ、その代わりに、なにかコマンドを叩くときに bundle exec をつけ忘れてエラーになることが時々あって、そんな時に少々めんどくさく感じます。bundle exec を省略できたらどんなに幸せでしょうか。
そんなわけで、 bundle exec を省略する方法をまとめたので紹介したいと思います。
rvm の gemset をアプリ毎に作って切り替える方法
下記のエントリに詳しくまとまっています。これの通りにやれば bundle exec から解放されるのは間違いないのですが、個人的にはアプリ毎に gemset を作るのは大げさな感じがします。
bundler-exec.sh を使う方法
bundler exec が必要そうなコマンド(rake とか rspec 等)を実行したときに、bundler プロジェクト内からの呼び出しであれば自動で bundle exec を頭に付け加える bundle-exec.sh という名前のシェルスクリプトがあります。bash を使っていれば下記のようにしてインストールします。
curl -L https://github.com/gma/bundler-exec/raw/master/bundler-exec.sh > ~/.bundler-exec.sh echo "[ -f ~/.bundler-exec.sh ] && source ~/.bundler-exec.sh" >> ~/.bashrc
設定完了の判別方法
うまく設定できた場合、コンソールで
type ruby
としたときに、
ruby is an alias for run-with-bundler ruby
のように表示されます。
bundler-exec.sh の詳細
詳しくはソース見るとわかりますが、bundler-exec.sh はあらかじめ ruby や rspec といった決められたコマンドに対しエイリアスを定義しておき、それらを実行したときに
- bundler がインストールされてるかどうか調べる
- カレントディレクトリから上に辿って Gemfile があるか調べる
- 1 と 2 が真なら bundle exec を頭に付け加えて実行する
のような挙動をするように書かれています。プロジェクト毎の設定もいらず手軽で便利そうなので、しばらくこれを使っていきたいと思います。