TL;DR (能書きはいいから3行で)
改めてgem install bundler
をすることで現状(2015-06-05現在)最新のBundler 1.10.3を使おう.
古いバージョンのBundlerがどうしても使いたいときはbundle _1.9.9_ install
のようにBundlerのバージョンを指定して使うことが出来る(当然このときはgem install bundler -v 1.9.9
されてることが前提).
みんながまだ1.10未満しか使ってないなら気にしなくてもいいんじゃないかな.
何が起こったか
最近gem install bundler
をしたばっかりの人がbundle install
すると,どうも既存のGemfile.lock
に謎の差分(BUNDLED_WITHうんたらが追記される)が発生する.これってVCSで無視する設定になってないし(※gemのプロジェクトの場合は無視する設定),コミットするのでいいんだよね?
…と思ってコミットをしてたら,どうも他の人がbundle install
したときにそれが消える.何勝手にGemfile.lockに書き込んでるんだこんなもん自動生成されないだろ,って言われて自分の手元で再度bundle install
をすると,やっぱりそれが追記される.
で,何が違うのか?と思ってよくよく見てみるとBundlerのバージョンがどうもGemfile.lock
に指定されるようになっていると気付く.この違いは1.10.0.pre.2からあるらしい.
さてどうしたものか?
問題なるのは,とにかく勝手にGemfile.lockが書き換えられるせいで,差分が生まれてしまって(※git status
が綺麗じゃない状態になってしまって),git pull
とかgit checkout
とかに支障が出ること.
他にもファイルの更新検知がこれの書き換えのせいで誤作動することとか…
何にせよ,バージョン管理下に置かれるファイルがbundle install
なんていう,cloneしてきて一番最初に実行しそうなコマンドで変更されてしまう,なんて状態が困らないわけがないわけで.
とりあえず言えることは,Bundler以外のgemはGemfile
とGemfile.lock
とBundlerというツールによってそれなりに正確に管理されるわけなのに,Bundler自体はRubyインストール直後に一回だけgem install bundler
で入れてそれっきり,なんて言う状態が良くない,っていうことなんじゃないでしょうか?
なので,出来る範囲でgem install bundler
を再度実行して,Bundlerも最新にしてあげましょう,ということです.
そういう結論でいいんじゃないかと思います.
そしてそれだけだと「そうは言っても自分だけ更新するわけにもいかない.他の人が1.10未満を使ってるからそれに合わせないと.」という問題に遭遇している人に対してフォローがなさすぎるので,複数バージョンのBundlerを共有させて適宜切り替えつつ使う方法をば.
gem list | grep bundler #=> bundler (1.10.3, 1.9.9)
bundle version #=> 1.10.3
bundle _1.9.9_ version #=> 1.9.9
はい,上記のように_1.9.9_
のような指定をつければ,Bundler自体のバージョンが切り替えられます.後は,
alias bundle='bundle _1.9.9_'
alias the-new-bundle='bundle _1.10.3_'
とかしておけば,デフォルトが1.9.9になって,新しい方のBundler使いたいときはthe-new-bundler install
とかすればいいようになるわけですね.
あとこの件についてのIssueを読んでると,結構炎上してる感じでした.基盤ツールとなるライブラリの作者さんも大変ですね
※でも私はどっちかって言うと「何が問題かについては何度も説明しただろ」「こういう状況で困るんだよ!」って騒いでた人の言ってることの方が共感出来ました.
英語得意じゃないので,誰かこのIssueとバージョン1.10系の今回の顛末をもっと上手くまとめられる方いらっしゃいましたら,まとめ直しお願いします(読みたいです).