事象
昔作ったRailsアプリを久しぶりに修正しデプロイしようとしたところ、以下のエラーが出力されました。
# 実行コマンド
Running $HOME/.rbenv/bin/rbenv exec bundle check
# エラー内容
Your bundle only supports platforms ["x86_64-darwin-18"] but your local platform is x86_64-linux. Add the current platform to the lockfile with `bundle lock --add-platform x86_64-linux` and try again.
バンドルはプラットフォーム["x86_64-darwin-18"]のみをサポートしますが、ローカルプラットフォームはx86_64-linuxです。 `bundle lock --add-platform x86_64-linux`を使用して現在のプラットフォームをロックファイルに追加し、再試行してください。
原因
Bundlerを実行できるプラットフォームが制限されているためです。
Bundler 2.2.0がリリースされた2020年11月10日以降にRailsアプリを作成すると、Bundlerが実行できるプラットフォームはデフォルトでRailsアプリを作成した環境のOSのみとなっています。例えば、RailsアプリをmacOSで作成すると、Bundlerが実行できるプラットフォームはmacOSのみとなっているため、そのままではLinuxなどの別のOSでBundlerを実行することができません。
Gemfile.lock
# Bundler 2.2以降
# Railsアプリを作成した環境によって以下のどちらかが記述されている
PLATFORMS
x86_64-darwin-18 # macOS
x64-mingw32 # Windows
# Bundler 2.2未満
# PLATFORMS
# ruby
Bundler 2.1.x以前はBundlerが実行できるプラットフォームにruby
とだけ記述されていたので、macOSで作成したRailsアプリでも何もしなくてもLinuxへデプロイできていました。
Bundler 2.2.xからは開発者がBundlerを実行する適切なプラットフォームを追加する必要があります。
インストールされているBundlerのバージョンは以下のコマンドで確認できます。
$ gem list bundler
*** LOCAL GEMS ***
bundler (default: 2.2.16, 2.1.4, 2.0.2)
対処
デプロイ先サーバーのOSをBundlerが実行できるプラットフォームに追加します。デプロイ先サーバーがLinuxの場合、以下のコマンドを実行します。
$ bundle lock --add-platform ruby
$ bundle lock --add-platform x86_64-linux
以下のようにGemfile.lock
に追加されていればOKです。
Gemfile.lock
PLATFORMS
ruby
x86_64-darwin-18
x86_64-linux