目次
1.はじめに
複数人で開発をしていると、依存ライブラリのバージョンを縛る場合が多いと思います。
例えば Podfile.lock や Cartfile.resolved などでバージョンを縛り、
それに沿って環境構築をすることになります。
Gemfile.lock も同様なのですが、bundle install
で環境構築をすると、
自分だけなぜか Gemfile.lock ファイルが更新されてしまう場合がありました。
今回はそれの解決方法についてまとめます。
2.前提条件
Mac: macOS Big Sur 11.5.1
Bundler: とあるバージョン
3.原因
Bundler のバージョンが他の人と異なっている場合、上記のようなことが起こり得ます。
(他の原因もあるかも知れませんが 🤔)
4.Bundler とは
Bundler provides a consistent environment for Ruby projects by tracking and installing the exact gems and versions that are needed.
https://bundler.io/
訳: Bundlerは、必要なgem やバージョンを正確に追跡してインストールすることで、
Rubyプロジェクトに一貫した環境を提供します。
4-1.Gem とは
The RubyGems software allows you to easily download, install, and use ruby software packages on your system. The software package is called a “gem” which contains a packaged Ruby application or library.
https://guides.rubygems.org/
訳: RubyGems は、Rubyのソフトウェアパッケージを簡単に
ダウンロード、インストールして、システム上で使用することができるソフトウェアです。
ソフトウェアパッケージは「gem」と呼ばれ、
Rubyのアプリケーションやライブラリがパッケージ化されています。
つまり Bundler とは Ruby 用ライブラリ(つまり gem) の
パッケージやそのバージョンを指定・特定してインストールすることができる gem、
ということになります。
パッケージやそのバージョンの指定は Gemfile に記述します。
そして bundle install
や bundle update
をすると、
gem ライブラリの依存関係が Gemfile.lock に出力されます。
5.解決方法
タイトルの件について、例えば以下のような方法があるかなと思います。
- bundle install 時のバージョンを指定する
- Bundler のバージョンを合わせる
- Gem のバージョンを合わせる
上に行くほど暫定的な対応になります。
逆に言うと下に行くほど根本的な対応になりますが、
その分影響範囲が広くなります。
5-1.bundle install 時のバージョンを一時的に合わせる
これは個人の環境のみで完結できます。
他の人の Bundler のバージョンを聞きます。
bundler -v
で、他の人の Bundler のバージョンがが例えば 2.0.2 なら、
以下のようなコマンドを打てばよいです。
bundle _2.0.2_ install
バージョン番号の前後にアンスコを付ける形です。
2.0.2 が自分のマシンに入っていない場合は、
まず以下のようにインストールする必要があります。
gem install bundler -v 2.0.2
このようにすると既存の Gemfile.lock を変更することなく環境構築ができるかと思います。
ただし毎回バージョン指定して bundle install
する必要がありそうです。
やや面倒くさいですね 🤧
5-2.Bundler のバージョンを合わせる
みんなで Bundler のバージョンを合わせます。
他の人のマシンに Bundler の特定のバージョンが入っていない場合は、
上記と同様にインストールしてもらう必要があります。
gem install bundler -v 2.0.2
この手段の場合、他の人も bundle install
をすると
Gemfile.lock に差分が出る状態となる場合があります。
ですので今後はその新しい Gemfile.lock を共通で使っていくことになります。
5-2-1.他の人は差分が出ない場合
自分のBundler のバージョンが他の人の Bundler よりも進んでいる可能性があります。
その場合は自分のBundler のバージョンを下げます。
以下のようにして自分のバージョンのBundler を消しましょう。
gem uninstall bundler -v 2.1.4
もし以下のようなワーニングが表示されて消せない場合。
Gem bundler-2.1.4 cannot be uninstalled because it is a default gem
自分がGem のデフォルトバージョンのBundler を使用していて、
それは消せない、と怒られてしまっています。
そのような場合は、後述のようにみんなでGem のバージョンを合わせるか、
Gem のデフォルトバージョンのBundler を削除するか、
の選択肢があります。
Gem のデフォルトバージョンのBundler を削除する方法は以下に詳しいです。
Qiita: docker内でGem(特にbundler)のdefault設定を解除したい!
が、この方法はあまりおすすめできないようです。
他のGem ライブラリで、
デフォルトバージョンを指定したBundler を利用している可能性があるためです。
rbenv を使っている場合、デフォルトはこの辺りに定義されています。
(パス中のバージョンは適宜読み替えてください)
/Users/<username>/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/specifications/default/
5-2-2.なぜ他の人は差分が出ないのか
自分のBundler のバージョンが他の人より進んでいて 2.1.4 だった場合。
他の人が bundle install
をすると、2.1.4 未満となる訳で、
少なくとも以下のBundler のバージョン記述に差分が出て欲しいものです。
BUNDLED WITH
2.1.4
が、ここの箇所には差分は出ません。
これはBundler の仕様として、
BUNDLED WITH よりも古いバージョンの bundler を使っている人は、 bundle install
しても BUNDLED WITHの記述を更新しない、ということのようです。
この辺りのことは以下に詳しいです。
Qiita BUNDLED WITH で Gemfile.lock が更新されてしまう件
5-3.Gem のバージョンを合わせる
みんなで Gem のバージョンを合わせる方法です。
これでデフォルトのBundler のバージョンも一致すると思います。
gem update --system
この辺りは以下の記事に詳しいです。
Qiita: 【Rails】bundlerのdefaultを変更する方法。 Warning: the running version of Bundler (x.x.x) is older than the version that created the lockfileの対処法。
6.最後に
複数人での開発をしていると共通の環境構築をするのは難しいですね 😣
以上です。
お疲れ様でした!