Gem パッケージサイズを約 38% 削減するファイル選択の見直し

rails/jbuilder

この PR は jbuilder.gemspec のファイルリスト定義を見直し、テストコードや開発支援ファイルを除外することで、gem の配布サイズを 32 KB から 20 KB に削減します。

背景

従来 s.filesgit ls-files の結果をそのまま使用しており、リポジトリに含まれるテストコードや CI 設定、開発用スクリプトまでが gem に同梱されていました。これらは実行時に不要であるにも関わらず、パッケージサイズを不必要に大きくしていました。

この過剰な取り込みが原因で、ユーザーが gem を取得した際のディスク使用量が増加し、配布時の帯域コストにも影響を及ぼす可能性がありました。したがって、実行に必須なファイルだけを明示的に指定する方針へ変更することが求められました。

技術的な変更

変更前jbuilder.gemspec では次のように記述されていました。

s.files         = `git ls-files`.split("\n")
s.test_files    = `git ls-files -- test/*`.split("\n")

変更後 では s.filesDir['lib/**/*'] と必須のライセンス・README だけを列挙し、テストファイルの明示的な指定を削除しました。

s.files = Dir['lib/**/*'] + ['MIT-LICENSE', 'README.md']

この差分により、test/ ディレクトリ以下や .devcontainer/, .github/workflows/, bin/, gemfiles/ など、実行時に不要なパスが gem から除外されます。実際に gem build 後のアーカイブサイズは 32 KB → 20 KB と約 37.5% の削減が確認されました。

設計判断

今回の変更は 実行コードだけを対象にした明示的なファイル列挙 という設計選択です。git ls-files のような自動列挙は便利ですが、リポジトリ構成が変化した際に不要ファイルが混入しやすく、パッケージサイズが膨張するリスクがあります。

一方で、Dir['lib/**/*'] に依存する方式は、lib/ 以下に新しいファイルを追加した場合は自動的に含まれるものの、README.mdMIT-LICENSE のようにコード外の必須ファイルは手動でリストに加える必要があります。したがって、メンテナンスコストは若干増加しますが、配布サイズとクリーンさを優先するというトレードオフが明示的に取られました。

まとめ

jbuilder.gemspec のファイルリストを限定的に定義し直すことで、テストや開発支援ファイルを除外し、gem のサイズを約 38% 縮小しました。実行時の振る舞いは変わらず、今後新規ファイル追加時は lib/ 配下と明示的に列挙したドキュメント類を忘れずに含めることが重要です。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
b152ce56

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文、背景、技術的変更、設計判断(任意)、まとめの5段階構成が揃っており、結論は単なる繰り返しになっていません。

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックは `````ruby:jbuilder.gemspec````` の形式で正しいが、PRリンクが "[PR #618]" となっており、仕様の "[#618]" 形式に沿っていません。

対象読者への適合性 ✓ PASS

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

エンジニア向けの専門的記述で、初心者向けの余計な説明はありません。

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

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

各セクションは総論→各論→結論の流れで構成され、段落はトピックセンテンスで始まり、1段落1テーマ、長さも適切です。

Diff内容との照合 ✓ PASS

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

記事中のコードブロックは提供されたDiffと完全に一致しており、削除・追加箇所が正確に反映されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用されている用語(gem、s.files、Dir['lib/**/*'] など)はPRと一致し、誤用はありません。

説明の技術的正確性 ✓ PASS

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

サイズ削減の数値や変更理由がPRの記述と合致しており、技術的な説明に誤りはありません。

事実の突合 ✓ PASS

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

全ての主張がPR情報(サイズ変化、除外ファイル一覧)で裏付けられており、捏造や推測は見られません。

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

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

32 KB → 20 KB、約38% 削減という数値はPRのデータと一致しています。

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

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

記事タイトルはPRの趣旨(gem サイズ削減)を正確に反映しています。

外部知識の正確性 ✓ PASS

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

LTS やリリース日程等の外部情報は含まれていません。

時間表現の正確性 ✓ PASS

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

時間表現の歪曲はありません。