Bundlerのバージョンの違いについて、本家のBundler 2.0のリリースアナウンスをもとに簡単に調査してみた。
Bundler2系の変更リスト
- Ruby2.3より前のバージョンのサポートを廃止
- RubyGem3.0.0より前のバージョンのサポートを廃止
- こっちだとRubyGems2.5.0以上でなければならないと書いてある...どっちだ?
- githubからgemのソースを取得する際に
https
でアクセスするように(1系はhttp
だった模様) - Errorとwarningが
STDERR
に出力されるように - Bundlerバージョンの自動切り替え
-
bundle install
実行の際、アプリのGemfile.lockに書かれたBundlerのバージョン(bundle install
した時に記録される。BUNDLED WITH
セクションに書かれる)に基づいて自動で適切なBundlerのバージョンに切り替える。アプリ内ディレクトリでbundler -v
を実行した時はこのバージョンが表示される。
-
Gemfile.lockに書かれたBundlerのバージョンは例えば以下のような感じ
$ grep -A 1 "BUNDLED WITH" Gemfile.lock
BUNDLED WITH
1.17.1
以下変更に関連する補足など
Bundler1系でインストールしたアプリを2系に上げたい時
Bundlerのバージョンを上げてbundle install
しても、BundlerはGemfile.lockに書かれたBundlerのバージョンでインストールしようとする。
そんな時、アプリのBundlerのバージョンを上げたい場合は、2系をインストールした上で下記を実行する。
※実行前にコミットやバックアップをお忘れなく!
bundle update --bundler
1系から2系へのバージョンアップ時に出力される実行結果
$ grep -A 1 "BUNDLED WITH" Gemfile.lock
BUNDLED WITH
1.17.3
$ bundle update --bundler
...
Bundle updated!
$ grep -A 1 "BUNDLED WITH" Gemfile.lock
BUNDLED WITH
2.0.1
なぜRubyGem3.0.0以上のバージョンでなければならないか
変更リストで挙げた「Bundler1系2系の自動切り替え」をスムーズに行うためにRubyGems3系から導入された機能を使っていることが理由らしい。
今後のバージョンアップについて
Bundlerのコア開発チームは1年毎にメジャーバージョンのアップデートを目指している模様。
Bundler開発チームはBundler1系で作られたアプリが動き続けるべきであるという考えのようで、上記「Bundler1系2系の自動切り替え」のような仕組みを今後のBundler3、4のリリースの際も採用する予定とのこと。