Akata Works

東京エンジニア。主にRuby,Go,たまにAWSとiOS。ゲーム音楽が好きです。連絡はTwitterかakata.onen@gmail.comまで

RailsとBundlerで`bundle exec`を省略した話とその時の副産物について

Railsアプリケーションの開発に使っているBundlerで一々bundle execを打つのって面倒ですよね。

調べてみるとrbenvのpluginだとかいろいろあるらしいのですが、
これまではずっとエイリアスでなんとか凌いでいました。

↓こんなやつ↓

alias rs='bundle exec rails server'
alias rc='bundle exec rails console'

まあ、これでも別にいいんですが、最近たまたまGitHubを漁っていたら、良さ気な回避方法を使用しているプロジェクトがあったのでちょっと移行してみました。

多分、仕組み的にはrbenvのpluginとそんなに変わらないんじゃないかな・・


※以下はアプリケーションルートにいる前提です

まず、bundle install時に--binstubsを付けて、railsやrakeコマンドの実行ファイルのスタブを作成しておきます。

bundle install --binstubs #{path}

※#{path}を指定しなければ'bin/‘ディレクトリ以下に作成されますが、Rails 4では元のスクリプトが上書きされるので注意してください

これで./bin/railsrailsコマンドが実行できる訳ですが、このままだとパスが通っていないのであんまり便利じゃないっす!

ただ、普通にパスを通してしまうと全てのディレクトリから実行可能になってしまうので、以下のディレクトリを作成して、".zprofile"ファイルに以下を記述します。

mkdir -p .git/safe/

多分'.git/safe/‘ディレクトリに大きな意味はないです。

export PATH=.git/safe/../../bin:$PATH

Bashなら". bash_profile"ファイルだっけ?

こうすることで、アプリケーションルートに".git/safe"ディレクトリが存在すれば、アプリケーションルートの"bin/“ディレクトリが実行パスに追加されるので、
アプリケーションルートでのみ実行可能で、かつbundle execを省略することができます。

実行パスに相対パスが来るのがなんか気持ち悪い気がしますが、仕組みが分かりやすいのでとりあえずこれに落ち着きました。
あと、僕は英語があんまり得意ではないので、もしかしたら本来の意図と違っているかもしれません・・( ̄ω ̄;)


これを応用すれば、ディレクトリレベルで実行可能なスクリプトエイリアスっぽいものが使えそうな気がしました。
環境変数もあんまり汚さないのでいいのではないでしょうか?(これが副産物です)

参考URL