https://github.com/rails/spring
Springに `Spring.dangerously_allow_disabling_reloading` オプションが追加され、これまで強制的に拒否されていた `config.enable_reloading = false` 状態での起動をオプトインで許可できるようになりました。すべてのリロード可能リソースをフォーク後の子プロセス内でレイジーロードするよう構成された大規模アプリで、テスト実行ごとのファイル stat コストを削減できます。デフォルト挙動は変わらず、設定名に `dangerously_` プレフィックスを付けることでリスクを明示しています。
Spring 4.5.0のリリース準備コミットです。バージョン番号の更新とCHANGELOGの確定のみを含み、このバージョンではSpringがインストールされていないBundlerグループで実行する際にエラーを発生させずスキップする機能変更がリリースされます。
CHANGELOG.md において、未リリースの「Bundler グループ外スキップ」エントリがリリース済みセクションに誤配置されていた問題を修正。エントリをファイル冒頭の Unreleased セクションへ移動し、変更履歴の整合性を回復しました。
binstubがBundlerの `requested_specs` を参照するよう変更され、`bundle config set without` などでインストール対象外となったグループにspringが含まれる場合でも `Gem::LoadError` を発生させずにスキップするようになりました。従来の `locked_gems.specs`(ロックファイル全体)から `definition.requested_specs`(実際に要求されているgem)への切り替えにより、`RAILS_ENV` 環境変数に依存しない信頼性の高い検出が実現されています。
Spring の次期リリース向け CHANGELOG に3件の変更が追記されました。新たに追加された `Spring.after_environment_load` フックにより、環境ロード後・GC最適化前のタイミングでテスト基盤を事前ロードし、フォークワーカーへの copy-on-write 継承が可能になります。あわせて、クライアント切断時の `Errno::EPIPE` によるプロセスクラッシュの修正と、フレームワーク基底クラスの先行オートロードによる各フォークでの不要な再初期化コスト削減も記録されています。
アクセプタンステスト用のダミーアプリ生成時に `~/.railsrc` が読み込まれることで発生するテストの誤動作を修正。`rails new` コマンドに `--no-rc` オプションを追加し、ユーザーの個人設定(例: `--database=postgresql`)がテスト環境に影響しないようにしました。あわせて変数名を `skips` から `options` に改名し、オプション配列の意味をより正確に表現しています。
SpringのpreloadフェーズでActionMailer::Base等のフレームワーク基底クラスを先行ロードすることで、ActionViewのCacheExpiry::ViewReloaderが空の状態で初期化される競合を解消します。これにより、各forkで発生していたprepend_view_pathのたびに走る不要なFileUpdateCheckerの完全再構築コストが排除されます。
クライアントがハンドシェイク途中で切断した際に Errno::EPIPE が伝播してSpringプロセスが強制終了するバグを修正。Spring::Server#serve と Spring::Application#serve にまたがる計5箇所の書き込みサイトに対し、ignore_client_disconnect ヘルパーを導入して切断済みクライアントへの書き込み失敗を安全に無視できるようになりました。特にサーバーのacceptループがクラッシュして以降のすべてのクライアントがタイムアウトするという最悪ケースが解消されています。
SpringにRails環境ロード直後に実行される `after_environment_load` フックが追加されました。`test_helper` などの重い初期化コードをSpringサーバープロセスへプリロードすることで、フォークされたテストワーカーがCopy-on-Writeでメモリを共有し、テスト実行ごとの初期化コストを削減できます。Shopifyのモノリスでは毎回2.4秒かかっていた `require` コストの解消を目的として実装されています。
Springサーバー起動時の環境変数が後続クライアントに漏洩する問題を修正。spawn_envのHash構築を変更し、未設定の環境変数もnilとして明示的に含めることで、fork時の環境変数削除を確実にしました。
Springで子プロセスがシグナルで終了した際に、終了コードが正しくクライアントに伝わらず常に0が返される問題を修正。Process::Status#to_iを使用してシグナル終了時も適切な終了コード(128 + シグナル番号)を返すように改善。
Railsの高速起動ツール「Spring」が、Rails 8.1とRuby 4.0のサポートを追加。CI/CDパイプラインに`summary`ジョブを追加してテストマトリックス全体の結果を正確に検出できるよう改善。Minitest 6未満への固定、Bundlerコマンドの更新など、最新環境への対応を進めています。