おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

bundle exec を省略する

Railsアプリの開発に bundler を使うようになって、gem 関連でハマることは少なくなったような気がします。ただ、その代わりに、なにかコマンドを叩くときに bundle exec をつけ忘れてエラーになることが時々あって、そんな時に少々めんどくさく感じます。bundle exec を省略できたらどんなに幸せでしょうか。

そんなわけで、 bundle exec を省略する方法をまとめたので紹介したいと思います。

rvm の gemset をアプリ毎に作って切り替える方法

下記のエントリに詳しくまとまっています。これの通りにやれば bundle exec から解放されるのは間違いないのですが、個人的にはアプリ毎に gemset を作るのは大げさな感じがします。

rvmのgemsetを使ってbundlerと賢く付き合う方法 - Hello, world! - s21g

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 はあらかじめ rubyrspec といった決められたコマンドに対しエイリアスを定義しておき、それらを実行したときに

  1. bundler がインストールされてるかどうか調べる
  2. カレントディレクトリから上に辿って Gemfile があるか調べる
  3. 1 と 2 が真なら bundle exec を頭に付け加えて実行する

のような挙動をするように書かれています。プロジェクト毎の設定もいらず手軽で便利そうなので、しばらくこれを使っていきたいと思います。

zsh で bundler-exec.sh を使う

現在の bundler-exec.sh は zsh だとうまく動きません。fork して修正してみたので zsh 使いの方はこちらをどうぞ。

curl -L https://raw.github.com/willnet/bundler-exec/master/bundler-exec.sh > ~/.bundler-exec.sh
echo "[ -f ~/.bundler-exec.sh ] && source ~/.bundler-exec.sh" >> ~/.zshrc