[iOS][Gemfile] bundle instsall すると Gemfile.lock に差分が出てしまう時の対処法

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 installbundle update をすると、
gem ライブラリの依存関係が Gemfile.lock に出力されます。

5.解決方法

タイトルの件について、例えば以下のような方法があるかなと思います。

  1. bundle install 時のバージョンを指定する
  2. Bundler のバージョンを合わせる
  3. 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.最後に

複数人での開発をしていると共通の環境構築をするのは難しいですね 😣

以上です。
お疲れ様でした!

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。