ERBテンプレートのtrim_mode対応により設定ファイルの空行制御が可能に

basecamp/kamal

Kamalの設定ファイル読み込み処理が拡張され、ERBテンプレートの trim_mode: "-" が有効化されました。これにより、条件分岐を含む設定ファイルで不要な空行が挿入される問題が解消されます。

背景

Kamalの設定ファイル(deploy.ymldeploy.staging.ymlなど)はERBテンプレートとして処理されますが、従来は条件分岐を含むテンプレートで意図しない空行が残る問題がありました。例えば、環境変数の有無で動的にサーバーリストを構築する際、<% if ... %>ブロックが空行を残してしまい、YAMLの構造が崩れることがありました。

以下の例では、ENV['EXTRA_IP']が存在する場合にサーバーを追加しますが、従来の実装では条件ブロックが2行の空行を残していました:

servers:
  - 1.1.1.1

  - 1.1.1.2

この空行はYAMLパーサーには影響しませんが、設定の可読性を損ない、意図しない構造変化を招く可能性がありました。

技術的な変更

lib/kamal/configuration.rbload_config_fileメソッドが変更され、ERBテンプレートの初期化時にtrim_mode: "-"オプションが追加されました。

変更前:

YAML.send(load_method, ERB.new(File.read(file)).result).symbolize_keys

変更後:

template = File.read(file)
rendered = ERB.new(template, trim_mode: "-").result
YAML.send(load_method, rendered).symbolize_keys

この変更により、テンプレート内で-%>を使用した場合、その行の改行が削除されるようになります。以下のテンプレートは、条件分岐による空行を残しません:

service: app
servers:
  - <%= ENV['MAIN_IP'] %>
<% if ENV['EXTRA_IP'].presence -%>
  - <%= ENV['EXTRA_IP'] %>
<% end -%>

レンダリング後の結果は以下のようになり、サーバーリストが連続した行として出力されます:

servers:
  - 1.1.1.1
  - 1.1.1.2

test/cli/main_test.rbには、このtrim_mode動作を検証する2つのテストケースが追加されました。1つ目は基本設定ファイルでの空行削除を検証し、2つ目はdestination固有の設定ファイル(deploy.staging.ymlなど)でも同様に機能することを確認しています。

設計判断

ERBのtrim_modeオプションを利用する方式が採用されました。独自の空行削除処理を実装するのではなく、ERBの標準機能を活用することで、Rubyエコシステムとの一貫性を保っています。

trim_modeには複数のオプション("%", "<>", ">", "-")が存在しますが、"-"が選択されました。このモードでは、-%>を使用した行の末尾の改行のみを削除し、<%<%=の動作には影響しません。テンプレート作成者が明示的に-%>を記述した箇所のみで空行削除が有効化されるため、既存のテンプレートへの影響を最小限に抑えられます。

変更前のERB初期化が1行で完結していたのに対し、変更後は3行に分割されています。これはテンプレートの読み込み、レンダリング、YAMLパースの各ステップを明確に分離し、将来的なデバッグやエラーハンドリングの拡張を容易にする意図があると考えられます。

まとめ

本PRは、KamalのERBテンプレート処理にtrim_modeを追加し、条件分岐による空行制御を可能にした変更です。標準的なERB機能の活用により、既存のテンプレートとの互換性を維持しながら、設定ファイルの可読性向上と構造の安定化を実現しています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事は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リンク記法の正確性

ファイル名付きシンタックスハイライト(```ruby:lib/kamal/configuration.rb)やPR番号のリンク記法が正しく使用されています。

対象読者への適合性 ✓ PASS

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

KamalやERBに関する知識を持つエンジニアを対象としており、専門用語のレベルや説明の粒度が適切です。

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

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

各セクションが総論→各論で構成され、各段落はトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られており、非常に読みやすいです。

Diff内容との照合 ✓ PASS

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

lib/kamal/configuration.rbのコード変更がDiff情報と正確に一致しており、テストファイルの追加についても正しく言及されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

ERB、trim_mode、YAMLなどの技術用語が文脈に応じて正確に使用されています。

説明の技術的正確性 ✓ PASS

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

trim_mode: "-"の機能や、それがもたらす効果に関する技術的な説明は正確かつ論理的です。

事実の突合 ✓ PASS

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

記事内のすべての主張は、PRのDescriptionやDiff内のコード変更によって裏付けられています。「設計判断」セクションの考察も、コードの変更から読み取れる妥当な内容です。

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

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

PR番号(#1718)やファイルパスが正確に記載されています。

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

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

記事のタイトルはPRの主題「ERBレンダリングを強化して設定ファイルの空行を削除する」を的確に要約しています。

外部知識の正確性 ✓ PASS

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

trim_modeの他のオプションに関する言及は、PRの変更内容を深く理解するための補足的な技術知識であり、PRと無関係な外部知識の捏造にはあたりません。

時間表現の正確性 ✓ PASS

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

「従来は〜」「変更により〜」といった時間表現は、PRの文脈と一致しており正確です。