Ruby Bug #22023 ワークアラウンドのエンコーディング修正

rails/bootsnap

LANG 環境変数が未設定または C に設定された環境で、Rubyソースファイルのパースが失敗する問題を修正しました。File.read のデフォルトエンコーディングに依存していた箇所を、明示的に UTF-8 を指定する形に変更しています。

背景

この修正は、バージョン 1.24.2 で導入された Ruby Bug #22023 ワークアラウンドの不具合に対処するものです。#541 で報告されたように、特定の環境下でワークアラウンド自体が新たな問題を引き起こしていました。

File.read はエンコーディングを明示しない場合、Encoding.default_external を使用します。この値は LANG 環境変数の影響を受けるため、LANG が未設定または C に設定されている環境では ASCII となります。Rubyのソースファイルには日本語などの非ASCII文字が含まれることがあるため、ASCII エンコーディングでパースするとエラーが発生します。

CI環境やコンテナ環境では LANG が設定されていないケースが多く、問題が再現しやすい状況にあります。

技術的な変更

lib/bootsnap/compile_cache/iseq.rb 内の compile_file_prism メソッドで、File.read の呼び出しに encoding: Encoding::UTF_8 を明示的に指定するよう変更されました。

変更前:

def compile_file_prism(path, options = nil)
  compile_prism(::File.read(path), path, path, nil, options)
end

変更後:

def compile_file_prism(path, options = nil)
  compile_prism(::File.read(path, encoding: Encoding::UTF_8), path, path, nil, options)
end

変更はこの1行のみです。Encoding::UTF_8 定数を直接指定することで、実行環境の LANG 設定やロケールに関わらず、常に UTF-8 としてソースファイルを読み込みます。

設計判断

Encoding::UTF_8 を呼び出し側で明示指定する方式 が採用されました。

Rubyのソースファイルはデフォルトで UTF-8 として扱われる(# encoding: コメントで上書き可能)という言語仕様に照らすと、パース前の読み込み時も UTF-8 を前提とするのが自然です。Encoding.default_external はあくまでユーザー向けI/Oのデフォルトであり、ソースコードのパースには適していません。

環境依存の暗黙的なデフォルト値に頼らず、意図を明示する定数を使うことで、異なるロケール設定を持つ環境間での動作の一貫性が保たれます。

まとめ

この修正は1行の変更ながら、「環境依存のデフォルト値ではなく、言語仕様に沿った明示的な指定を使う」という原則を体現しています。ロケール設定が統一されていないCI環境やコンテナ環境において、1.24.2 のワークアラウンドが安定して機能するようになります。

記事メタデータ

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

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)→背景・技術的変更・設計判断(各論)→まとめ(結論)という3部構成が明確に適用されており、模範的な構成です。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト、コミットIDの短縮リンク、Issue番号のリンクなど、すべてのカスタムMarkdown構文が正しく使用されています。

対象読者への適合性 ✓ PASS

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

エンコーディングやRubyの内部的な挙動に関するトピックであり、専門知識を持つエンジニアという対象読者に適合した内容です。

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

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

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

Diff内容との照合 ✓ PASS

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

記事内で引用されているコードは、提供されたDiff情報と完全に一致しており、ファイルパスも正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「Encoding.default_external」「LANG」などの技術用語が、PR情報と整合性を保ちつつ、文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

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

File.readの挙動やLANG環境変数の影響に関する説明は技術的に正確であり、PR Descriptionの内容とも一致しています。

事実の突合 ✓ PASS

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

記事内の主張はすべてPRのTitle, Description, Diff, CHANGELOGから裏付けられており、ハルシネーションは検出されませんでした。

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

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

コミットID(7c36e01)、Issue番号(#541)、バージョン番号(1.24.2)など、すべての数値・固有名詞が正確です。

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

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

記事のタイトルは元のコミットメッセージの主題を正確に反映しており、内容との乖離はありません。

外部知識の正確性 ✓ PASS

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

記事の内容は提供されたPR情報に限定されており、サポート状況やリリース予定といったPR外の知識の捏造はありません。

時間表現の正確性 ✓ PASS

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

「1.24.2で導入された」といった過去の事実や、現在の問題状況に関する時間表現は正確です。