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/rails
でrailsコマンドが実行できる訳ですが、このままだとパスが通っていないのであんまり便利じゃないっす!
ただ、普通にパスを通してしまうと全てのディレクトリから実行可能になってしまうので、以下のディレクトリを作成して、".zprofile"ファイルに以下を記述します。
mkdir -p .git/safe/
多分'.git/safe/‘ディレクトリに大きな意味はないです。
export PATH=.git/safe/../../bin:$PATH
※Bashなら". bash_profile"ファイルだっけ?
こうすることで、アプリケーションルートに".git/safe"ディレクトリが存在すれば、アプリケーションルートの"bin/“ディレクトリが実行パスに追加されるので、
アプリケーションルートでのみ実行可能で、かつbundle exec
を省略することができます。
実行パスに相対パスが来るのがなんか気持ち悪い気がしますが、仕組みが分かりやすいのでとりあえずこれに落ち着きました。
あと、僕は英語があんまり得意ではないので、もしかしたら本来の意図と違っているかもしれません・・( ̄ω ̄;)
これを応用すれば、ディレクトリレベルで実行可能なスクリプトやエイリアスっぽいものが使えそうな気がしました。
環境変数もあんまり汚さないのでいいのではないでしょうか?(これが副産物です)
参考URL
PATH=".git/safe/../../bin:$PATH" and do mkdir .git/safe in the root of repositories that you trust.
— Tim Pope (@tpope) 2012年2月4日