Rails7 からは Webpacker の標準サポートが外されました。これにより 7 以前から Webpacker を使って動かしているアプリを Rails7 にアップグレードすると、そのままでは AWS Elastic Beanstalk にデプロイすることができません。
AWS Elastic Beanstalk にデプロイをすると assets:precompile
のタイミングで error Command "webpack" not found.
というエラーになります。エラー文言の通り webpack
コマンドがないというエラーです。
この原因は Webpacker の標準サポートが外されたことにより、従来は bundle exec rake assets:precompile
の実行タイミングに自動で bundle exec rake yarn:install
が実行されていましたが Rails7 からは実行されなくなったことです。
該当のコミット
-# Run Yarn prior to Sprockets assets precompilation, so dependencies are available for use.
-if Rake::Task.task_defined?("assets:precompile") && File.exist?(Rails.root.join("bin", "yarn"))
- Rake::Task["assets:precompile"].enhance [ "yarn:install" ]
-end
この yarn:install
はその名前の通り yarn install
コマンドを実行してくれます。これが実行されないと webpack
コマンド自体がインストールされません。
Beanstalk は自動で assets:precompile
を実行する
Rails7 で yarn:install
が自動実行されなくなった対処法はシンプルで、手動で yarn:install
を実行するだけです。ただし AWS Elastic Beanstalk の場合はデプロイ時に自動で assets:precompile
を実行してくれるお陰で手動で実行するタイミングがありません。
container_commands
は実行タイミングがもっと後なので間に合いませんし、commands
では早すぎます。というわけで、 AWS Elastic Beanstalk で Webpacker を動かす方法は先ほどのコミットをなかったことにするのが簡単です。
依存ファイルを作成する
適当に lib/tasks/yarn.rake
ファイルを作成し、以下の内容を記述します。
Rake::Task["assets:precompile"].enhance [ "yarn:install" ]
これで Rails6 と同様に assets:precompile
の際に yarn:install
が実行されます。デプロイも正常にできるようになると思います。良かったですね。とはいえ Webpacker はもうメンテナンスがされないので、早いうちに他に移行をした方が良いでしょう。