0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

異なるOS間でのGemfile.lockの競合を解決する方法

Posted at

はじめに

オリジナルプロダクト(ポートフォリオ)のデプロイに向けて、最新のソースコードをAWS EC2に反映させようとしたところ、Gemfile.lock の競合が発生しました。
その原因と解決方法についてまとめました。

開発環境

  • ローカルマシン
    • OS:macOS Ventura
  • AWS EC2
    • OS:Amazon Linux 2
  • 共通
    • Ruby:3.2.2
    • Rails:7.0.6
    • Bundler:2.4.13

エラーメッセージ

EC2 にgit pullで最新のソースコードを反映させようとしたところ、以下のエラーメッセージが表示されました。

error: Your local changes to the following files would be overwritten by merge:
	Gemfile.lock
Please commit your changes or stash them before you merge.

「次のファイルに対するローカルの変更が、マージ時に上書きされる可能性があります:
    Gemfile.lock
マージする前に、変更内容をコミットするかスタッシュしてください。」

という内容です。

原因

git diffで差分を調べたところ、以下のようにでました。
※ 一部抜粋

     tailwindcss-rails (2.0.30-x86_64-darwin)
+    tailwindcss-rails (2.0.30-x86_64-linux)

     PLATFORMS
       x86_64-darwin-22
+          x86_64-linux

一部のgemはOS特有のバージョンが存在する様です。

最初に、EC2にプロジェクトをクローンした後、Bundlerの bundle install コマンドでgemのインストールを行いました。
この時点で Gemfile.lock に差分が発生しているのですが、これを認識しないまま更新内容を git pull しようとしたため、先述のエラーが出てしまいました。



時系列に沿ってまとめると、以下の様になります。

  1. ローカルマシン(macOS)で開発し、リモートリポジトリに push
    • 一部gemは、macOS準拠のバージョン
  2. AWS EC2 にクローン
  3. EC2(Amazon Linux 2)で bundle install 実行
    • 一部gemは、Amazon Linux 2準拠のバージョン
    • ここで差分発生!
  4. 差分を認識せず git pull したため競合エラー

解決策

ローカルの開発環境で bundle lock --add-platform オプションを使うことによって
指定したプラットフォームのための依存関係を Gemfile.lock に追加する。

私のケースでは

  • 開発環境が macOS (x86_64-darwin)
  • 本番環境が Linux (x86_64-linux)

なので

ローカルのプロジェクトディレクトリで

bundle lock --add-platform x86_64-linux

とコマンドを入力することで、両プラットフォームの依存関係を考慮した Gemfile.lock を生成できます。

これによりOSの違いによって起こる Gemfile.lock の差分が発生しなくなりました。

おわりに

最後までお読みいただきありがとうございます。
少しでも参考になれば幸いです。
記事内に不備がありましたら遠慮なくご指摘いただけると嬉しいです。



余談ですが、ChatGPT(GPT-4)からは、BundlerのBUNDLE_IGNORE_PLATFORMS という設定を使えと回答され、また公式ドキュメントの「PLATFORMS」セクションを参照しろとのことでした。

しかし、公式ドキュメントに該当する記載はありませんでした。

その旨ChatGPTに伝えたところ、謝罪に加え、当機能が一部の開発者コミュニティでは説明・使用されている旨の言い訳を聞かされました。笑

  • 公式ドキュメントの参照はマスト
  • ChatGPTは叩き台作成用に使ったり、ヒントを得るために使う。参考程度に。

今回、再認識した教訓です。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?