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

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

Rails 4.0 と bundler install --binstubs について

Rails 4.0.beta1 でアプリ作ってみようとして、途中で bundle install --binstubs としたら、なぜか rails generate などのコマンドが効かなくなってしまいました。、これは、Rails 4.0 が生成する bin/rails を bundler がオーバライドしてしまったことが原因です。前に何処かで「bundler 1.3 は bin/rails が存在していたらオーバライドしないようにする」みたいなことを読んだ気がしたのですが、これはどういうことだったのだろう…というかそもそもなんでオーバライドしたら不具合起きるの><と思ったのでちょっと調べてみました。そして「多分こういうことなんだろうなあ」というところまで来たのでまとめてみます。推測も混じってるので間違ってたら教えてください。

Rails 4.0 での変更

Rails 4.0 からは script/rails をやめて bin/rails にする。ついでに bin/rakebin/bundle もデフォルトで作る。rails console などのコマンドを実行したいときの選択肢がたくさんあってわかりにくいのを一本化するのが理由かな?

  • rails console
  • bundle exec rails console
  • script/rails console

ついでに rails コマンドの挙動が変わる。gem i rails で入る rails コマンドは rails new 専用になった。(Rails 3 までは rails コマンドが Rails プロジェクト中で実行されたかどうかを調べて、rails コマンドそのものを実行するか script/rails を実行するかを切り替えていた)

bundler での変更

bundle install --binstubs の挙動を、bundler 1.3 でファイルが既に存在していたらオーバライドしないようにする仕様を検討。最終的には後方互換性を考え変更せず。

代わりに? bundle binstubs コマンドが新しく作られた。これは既にファイルがあったらオーバライドしない。ただし一度に一つの gem しか指定できないので、たくさんのコマンドを bin/ 配下に置きたいときはめんどい

「これ不便じゃね?なんとかしてよ」という人達が issue に書き込む

https://github.com/carlhuda/bundler/issues/2253

bundler が bin/rails を上書きしてたら「Rails 4 は bundle install --binstubs サポートしてないからもう使っちゃダメだよ」と出力する pull request が投げられる ←イマココ!

https://github.com/rails/rails/pull/9843

まとめ

Rails 4.0 ではいまのところ

  • bundle install --binstubs は使わない
  • bin/ 配下にコマンド置きたい時は、都度 bundle binstubs hogehoge とする

とするしかなさそう。ちょっとめんどいですが仕方ないのかなあ

追記

@onk さんからメンション頂きました。

ということで、bin 以外のディレクトリを使う手段もありますね!