これはRuby/Rails Advent Calendar 2025 の 5日目の記事です。
Ruby/Rails - Qiita Advent Calendar 2025 - Qiita
次のPRで、Rails8.2でrails newしたときに生成されるconfig/environments/test.rbにconfig.rake_eager_load = ENV["CI"].present?が追加されました
これはなんでしょうか。というのが今日の本題です。これを説明するには前提となるところから話していかないといけません。
config.eager_loadとは
Railsにはconfig.eager_loadという設定があります。これはRailsを起動したときにすべてのアプリケーションコードを読み込むかどうかの設定です。だいたいのRailsアプリケーションにおいて開発環境ではfalse、本番環境ではtrueになっているはずです。
テスト環境においては、Rails7.0より前はデフォルトfalseでしたが、Rails7.0からENV["CI"]の有無を見てCI実行時にはeager_loadするという設定になりました*1。
Enable eager loading by default on CI systems by byroot · Pull Request #43508 · rails/rails
CIでアプリケーション全体のテストを実行するときはeager loadしたほうがテストが安定するというのが主な理由です。
config.rake_eager_loadとは
一方で、rakeタスク実行時はeager_loadを無効にするという仕様がありました(Rails4.1から)。
導入されたPR: #11381: Ignore config.eager_load=true for rake by pftg · Pull Request #11389 · rails/rails 元となったIssue: Precompile tries to access the database on acceptance validation · Issue #11381 · rails/rails
元となったIssueは、「自分のアプリケーションだとrake assets:precompileでDBアクセスが発生してrakeタスクが失敗するのでそれを避けたい」というものでした。これの解決策として「rakeタスク実行時はeager loadを無効にする」が入りました。
しかしrakeタスクでeager_loadを強制的に無効にするのではなくて設定可能にしたいという人が現れconfig.rake_eager_loadが生まれました(Rails6.1から)。
[Railties] Add config rake_eager_load by tjoyal · Pull Request #28209 · rails/rails
互換性を考えてデフォルトはfalseになっています。
rakeタスクのときは常にconfig.rake_eager_loadを見る
先程Rails7.0以降はENV["CI"]の有無を見てCI実行時にはeager_load設定になったと書きましたが、これはrakeタスクには適用されていませんでした。理由はconfig.rake_eager_loadを参照する次のコードです。
rails/railties/lib/rails/application.rb at 4c53863e354ad94dbfaf0643d9cdc99393a1a583 · rails/rails
Railsアプリケーションで利用するrakeタスク内でよく使われる:environmentタスクを実行するとconfig.rake_eager_loadの値でconfig.eager_loadが上書きされてしまいます。これによりeager loadしているはずのbin/rails testがeager loadしていませんでした。
RSpecだとどうだろう?と思ったのでbin/rake経由でのRSpecを実行したのですがconfig.eager_load #=> trueだったので、恐らくRSpecユーザは(少なくともテストの実行に関しては)影響はないはず。
しかしRails標準のテスト実行時にconfig.eager_load = trueしたはずなのにeager loadされていないというのは混乱を招くので、今回その対策としてconfig.rake_eager_load = ENV["CI"].present?もconfig/environments/test.rbに追加されたというわけです。
テストに限らず本番環境でもconfig.rake_eager_loadは気をつけないといけない
ここまでCIの話をしましたが、本番環境でも同じことがおきます。config.eager_load = trueになっていてもconfig.rake_eager_load = trueにしないとrakeタスク実行時にeager loadしません。これを知らずにeager loadしている前提のrakeタスクを実行すると不具合に繋がります。
Rails Guidesにも2年ほど前に注意書きが追加されています。
Document config.rake_eager_load in the autoloading guide · rails/rails@6cbd2c9
今回導入されたPRはRails8.2でrails newしたときに反映されますが、各設定値は昔からあるものなので先んじてconfig/environments/test.rbやconfig/environments/production.rbに反映しておくと幸せになれる人がいるのではないでしょうか。
こういう話をもっと聞きたいひと
今回のエントリはお手伝い先で最近のRails情報を共有する一環で調査したものです。もっとこういう話を聞きたいぞ、というひとは 株式会社ウィルネットとして提供する技術顧問サービスについて を参照のうえお問い合わせください。
*1:Rails7.0以降でrails newしたときのconfig/environmets/test.rbがそうなるというだけなので、昔からあるRailsアプリケーションでは変わらずfalseなところも多いと思います。