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/rake と bin/bundle もデフォルトで作る。rails console などのコマンドを実行したいときの選択肢がたくさんあってわかりにくいのを一本化するのが理由かな?
rails consolebundle exec rails consolescript/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 さんからメンション頂きました。
@netwillnet --binstubs=bundle_bin とか適当にディレクトリ変えるのオススメ
— Takafumi ONAKAさん (@onk) 2013年4月1日
ということで、bin 以外のディレクトリを使う手段もありますね!