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 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 さんからメンション頂きました。
@netwillnet --binstubs=bundle_bin とか適当にディレクトリ変えるのオススメ
— Takafumi ONAKAさん (@onk) 2013年4月1日
ということで、bin 以外のディレクトリを使う手段もありますね!