`rails new` 生成の Kamal gem を development グループへ移動
rails new が生成する Gemfile で、gem "kamal" がトップレベルから group :development に移動されました。これにより、デプロイツールである Kamal がデフォルトでプロダクションバンドルに含まれなくなります。
背景
Kamal はアプリケーションのランタイム依存ではなく、Dockerコンテナとしてアプリをデプロイするためのツールです。しかし、これまでの生成テンプレートでは gem "kamal", require: false がトップレベルに配置されていたため、bundle install を実行するとプロダクション環境のバンドルにも Kamal が含まれてしまっていました。
#57205 で報告されたこの問題は、プロダクションコンテナイメージのサイズを不必要に増加させ、アプリケーションが実際には使用しない依存関係を抱えるという点で問題視されていました。デプロイツールが本番稼働中のアプリバンドルに含まれることは、依存関係管理の観点からも好ましくない設計です。
技術的な変更
railties/lib/rails/generators/rails/app/templates/Gemfile.tt テンプレートが変更され、Kamal の gem 定義がトップレベルから group :development ブロックの先頭に移動されました。
変更前:
# Deploy this application anywhere as a Docker container [https://kamal-deploy.org]
gem "kamal", require: false
# ...
group :development do
# Use console on exceptions pages [https://github.com/rails/web-console]
gem "web-console"
end
変更後:
group :development do
# Deploy this application anywhere as a Docker container [https://kamal-deploy.org]
gem "kamal", require: false
# Use console on exceptions pages [https://github.com/rails/web-console]
gem "web-console"
end
テンプレートロジックも整理され、--skip-kamal と --skip-dev-gems の両オプションが group :development ブロック全体の出力制御と統合されました。APIモードアプリの場合は web-console が不要なため、Kamal のみを含む group :development ブロックが生成されます。
テスト面では railties/test/generators/app_generator_test.rb に test_kamal_is_in_development_group が追加され、生成された Gemfile において Kamal が group :development 内に存在し、かつトップレベルには存在しないことを検証します。また test_skip_dev_gems に assert_no_gem "kamal" が追加され、--skip-dev-gems 指定時に Kamal も除外されることが保証されました。railties/test/generators/api_app_generator_test.rb では、APIアプリでも group :development が1つだけ生成され、その中に Kamal が含まれることを検証するアサーションが追加されています。
設計判断
Kamal を group :development に統合することで、--skip-dev-gems オプションとの一貫性が確保されました。これまで Kamal はトップレベルに置かれていたため --skip-dev-gems の影響を受けず、開発用 gem をスキップしたい場合は別途 --skip-kamal が必要でした。新しい設計では --skip-dev-gems を指定するだけで Kamal も除外される自然なふるまいになっています。
APIモードでの扱いも注目点です。APIアプリでは web-console は不要ですが、Kamal はデプロイツールとして必要になりうるため、APIモードでも group :development に Kamal を含む設計が維持されています。テンプレートの条件分岐は group :development ブロックを skip_kamal? と api? の組み合わせで制御し、ブロック自体の重複出力を防いでいます。
まとめ
今回の変更は、rails new の生成テンプレートにおけるデプロイツールの配置を是正したものです。Kamal を group :development に移動することで、プロダクションバンドルの肥大化を防ぎ、gem の用途とグループの対応関係をより正確に反映した Gemfile が生成されるようになりました。