概要
複数バージョンのbundlerがインストールされているとき、どれが選択されるのか曖昧だったので実験
注意
公式ドキュメントの記述がみあたらなかったので、バージョンが変わると挙動が変わるかもしれないです
環境
ruby:3.0.1-alpine
を使用。defaultで入っているbundlerは、2.2.15です
docker run --rm --name ruby -it ruby:3.0.1-alpine /bin/sh
/ # gem list --local | grep bundler bundler (default: 2.2.15) / # bundler -v Bundler version 2.2.15
先に結論
以下の優先順でバージョンが選ばれるようです。default は関係ない様子
$BUNDLER_VERSION
- Gemfile.lock の
BUNDLED WITH
- 一番新しいバージョン
複数バージョンを入れた場合、default
や、インストール順は左右されず、最新のバージョンが参照される
/ # gem install bundler:2.2.20 Fetching bundler-2.2.20.gem Successfully installed bundler-2.2.20 1 gem installed / # gem install bundler:2.2.19 Fetching bundler-2.2.19.gem Successfully installed bundler-2.2.19 1 gem installed / # gem list --local | grep bundle bundler (2.2.20, 2.2.19, default: 2.2.15) / # bundle -v Bundler version 2.2.20
ディレクトリに Gemfile.lock
がある場合、そこの BUNDLED WITH
にかかれているバージョンが参照される
/ # cat <<EOS > Gemfile.lock > GEM > remote: https://rubygems.org/ > specs: > rack (2.0.6) > > PLATFORMS > ruby > > DEPENDENCIES > rack > > BUNDLED WITH > 2.2.19 > EOS / # bundle -v Bundler version 2.2.20
環境変数 BUNDLER_VERSION
があると、それが最優先される
/ # export BUNDLER_VERSION=2.2.15 / # bundle -v Bundler version 2.2.15
環境変数 BUNDLER_VERSION
や、Gemfile.lock に書かれたバージョンがインストールされていな場合、最新のバージョンが参照される
bundle install
しない限り、特に警告は出ませんでした
/ # export BUNDLER_VERSION=2.2.13 / # cat <<EOS > Gemfile.lock > GEM > remote: https://rubygems.org/ > specs: > rack (2.0.6) > > PLATFORMS > ruby > > DEPENDENCIES > rack > > BUNDLED WITH > 2.2.16 > EOS / # bundle -v Bundler version 2.2.20
おまけ: bundle _version_
でバージョンを明示的に指定すると、そのバージョンが参照される
/ # bundle _2.2.15_ -v Bundler version 2.2.15
存在しないバージョンを指定すると怒られます
/ # bundle _2.2.00_ -v /usr/local/lib/ruby/3.0.0/rubygems.rb:281:in `find_spec_for_exe': can't find gem bundler (= 2.2.00) with executable bundle (Gem::GemNotFoundException) from /usr/local/lib/ruby/3.0.0/rubygems.rb:300:in `activate_bin_path' from /usr/local/bundle/bin/bundle:23:in `<main>'
古い ruby image だと、挙動が変わります
docker run --rm --name ruby -it ruby:2.5.1-alpine /bin/sh
/ # gem list --local | grep bundler bundler (1.16.6, default: 1.16.2) / # bundler -v Bundler version 1.16.6
2.2.20
をインストールしても、1.16.6
が参照されたまま
/ # gem install bundler:2.2.20 / # gem list --local | grep bundler bundler (2.2.20, 1.16.6, default: 1.16.2)
/ # bundler -v Bundler version 1.16.6
これは、古い ruby の Dockerfile の中で BUNDLER_VERSION
が設定されているため
そのため、BUNDLER_VERSION
を unset しないと想定通りの挙動してくれない
こちらのissueで議題になって、新しいバージョンでは BUNDLER_VERSION
がセットされないようになっています