`rails new` 生成の Kamal gem を development グループへ移動

rails/rails

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.rbtest_kamal_is_in_development_group が追加され、生成された Gemfile において Kamal が group :development 内に存在し、かつトップレベルには存在しないことを検証します。また test_skip_dev_gemsassert_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 が生成されるようになりました。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
bddde2b2

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→背景・技術詳細・設計判断(各論)→まとめ(結論)という構成が明確で、ガイドラインに完全に準拠しています。各セクションの役割がはっきりしており、非常に読みやすいです。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```erb:ファイルパス)やGitHubのIssue/PRリンク記法([#123](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Rails開発者を対象読者として、`Gemfile`や`bundle`、デプロイツールに関する専門用語を適切に使用しており、過度な説明がなく簡潔です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクション、各パラグラフが「総論→各論」の構造で書かれています。また、各段落の冒頭にトピックセンテンスが置かれているため、要点を素早く把握できます。1段落1トピックの原則も守られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているコードブロック(変更前・変更後)は、提供されたDiff情報と完全に一致しています。ファイルパスの指定も正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「プロダクションバンドル」「railties」「APIモード」「--skip-dev-gems」など、PRコンテキストで使われる技術用語を正確に使用しています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

Kamalが`group :development`に移動されることによる影響(プロダクションバンドルからの除外)や、`--skip-dev-gems`オプションとの挙動の統一など、技術的な説明はすべて正確で論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(Kamalの移動、関連Issue番号、テストの変更など)は、提供されたPRのタイトル、Description、Diff内容によって裏付けられており、ハルシネーションは検出されませんでした。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#57240)、Issue番号(#57205)などの数値や固有名詞はすべて正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「`rails new` 生成の Kamal gem を development グループへ移動」は、PRのタイトル「Move generated kamal gem into development group」の内容を的確に反映しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事の内容は提供されたPR情報とその直接的な技術的帰結に限定されており、LTSやリリース日程といったPR外の外部知識の追記は見られませんでした。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「これまでの生成テンプレートでは」「移動されました」など、変更の前後関係を示す時間表現が正確に使われています。