はじめに
オリジナルプロダクト(ポートフォリオ)のデプロイに向けて、最新のソースコードを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
しようとしたため、先述のエラーが出てしまいました。
時系列に沿ってまとめると、以下の様になります。
- ローカルマシン(macOS)で開発し、リモートリポジトリに
push
- 一部gemは、macOS準拠のバージョン
- AWS EC2 にクローン
- EC2(Amazon Linux 2)で
bundle install
実行- 一部gemは、Amazon Linux 2準拠のバージョン
- ここで差分発生!
- 差分を認識せず
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は叩き台作成用に使ったり、ヒントを得るために使う。参考程度に。
今回、再認識した教訓です。
参考