Gem パッケージサイズを約 38% 削減するファイル選択の見直し
この PR は jbuilder.gemspec のファイルリスト定義を見直し、テストコードや開発支援ファイルを除外することで、gem の配布サイズを 32 KB から 20 KB に削減します。
背景
従来 s.files は git ls-files の結果をそのまま使用しており、リポジトリに含まれるテストコードや CI 設定、開発用スクリプトまでが gem に同梱されていました。これらは実行時に不要であるにも関わらず、パッケージサイズを不必要に大きくしていました。
この過剰な取り込みが原因で、ユーザーが gem を取得した際のディスク使用量が増加し、配布時の帯域コストにも影響を及ぼす可能性がありました。したがって、実行に必須なファイルだけを明示的に指定する方針へ変更することが求められました。
技術的な変更
変更前 の jbuilder.gemspec では次のように記述されていました。
s.files = `git ls-files`.split("\n")
s.test_files = `git ls-files -- test/*`.split("\n")
変更後 では s.files に Dir['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.md や MIT-LICENSE のようにコード外の必須ファイルは手動でリストに加える必要があります。したがって、メンテナンスコストは若干増加しますが、配布サイズとクリーンさを優先するというトレードオフが明示的に取られました。
まとめ
jbuilder.gemspec のファイルリストを限定的に定義し直すことで、テストや開発支援ファイルを除外し、gem のサイズを約 38% 縮小しました。実行時の振る舞いは変わらず、今後新規ファイル追加時は lib/ 配下と明示的に列挙したドキュメント類を忘れずに含めることが重要です。