FileStore が fileutils を明示的に require してスタンドアロン環境の NameError を防止
ActiveSupport のキャッシュ実装 FileStore が内部で FileUtils を使用しながら require "fileutils" を欠いていたため、Rails 本体を含まない環境で NameError が発生していました。本 PR はその欠如を補い、単体の ActiveSupport でも安全にキャッシュが利用できるようにします。
背景
FileStore はキャッシュディレクトリの作成や削除に FileUtils.makedirs と FileUtils.rm_r を利用していますが、ファイル冒頭に require "fileutils" が記載されていませんでした。その結果、フルスタックの Rails アプリでは別ファイルが間接的に fileutils をロードするため問題が隠れましたが、ActiveSupport のみをロードしたプロセスでは最初の書き込みやクリア時に NameError がスローされました。したがって、スタンドアロン環境でのキャッシュ利用が実質的に不可能となっていました。
技術的な変更
本 PR は activesupport/lib/active_support/cache/file_store.rb の冒頭に require "fileutils" を追加し、FileStore が依存する標準ライブラリを明示的にロードするようにしました。
@@ -1,5 +1,6 @@
# frozen_string_literal: true
+require "fileutils"
require "active_support/core_ext/file/atomic"
require "active_support/inspect_backport"
require "active_support/core_ext/string/conversions"
追加された一行は唯一の変更点であり、既存ロジックや公開インターフェースには一切影響しません。require は冪等であり、既にロード済みの場合は何も再ロードしないため、フルスタック環境でも副作用はありません。この変更により、FileStore の ensure_cache_path と clear メソッドで呼び出される FileUtils.makedirs と FileUtils.rm_r が常に利用可能となり、NameError が解消されます。
設計判断
FileStore が自己完結的に必要な標準ライブラリをロードする方針が採用されました。これにより、モジュール単体での使用時に暗黙的な依存が前提となるリスクが排除され、Ruby の慣習である「必要なファイルは明示的に require する」ことに合致します。新たな設定キーやフラグを導入せず、既存コードに最小限の変更で済んだため、互換性と保守性が維持されています。
まとめ
FileStore が require "fileutils" を明示的に追加したことで、スタンドアロンの ActiveSupport 環境でも NameError が発生せず、キャッシュディレクトリの作成・削除が期待通りに機能します。変更はコード行の追加のみで後方互換性を保持し、モジュールの自己完結性という設計原則を強化しました。