Bundler 1.10.Xを使うために

  • 53
    Like
  • 0
    Comment
More than 1 year has passed since last update.

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はGemfileGemfile.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系の今回の顛末をもっと上手くまとめられる方いらっしゃいましたら,まとめ直しお願いします(読みたいです).

References