libディレクトリの自動読み込み方法として、Rails 7.1で新たに、config.autoload_lib
というメソッドが追加されました。
今まで、
- libディレクトリ以下全てを
config.eager_load_paths
に追加していたり -
app/lib
ディレクトリを作成したり
といった方法があり、Railsのデフォルトでlib配下を自動読み込みする方法を推奨していませんでしたが、Rails v7.1からconfig/application.rb
に以下のように記述する方法がデフォルトとなりました。
config.autoload_lib(ignore: %w(assets tasks))
v7.0 (やそれ以前のバージョン) でも、以下のように記述したものと同義となります。
lib = root.join('lib')
config.autoload_paths << lib
config.eager_load_paths << lib
Rails.autoloaders.main.ignore(
lib.join('assets'),
lib.join('tasks')
)
詳しくはPull Requestを確認してください。
libディレクトリすべてを自動読み込みしないほうがいい理由について
libディレクトリ全てを自動読み込みする設定は推奨されていませんでした。 1
autoload_lib
が追加されたPull Requestによると、
Some history
The lib directory was in the autoload paths by default in the early versions of Rails. However, lib stores different kinds of files, and eager loading in production proved to be an issue. Some files in there are not meant to be autoloaded or eager loaded. Think generators, for example.
Because of that, lib was removed from the default autoload paths in Rails 3.
とあるように、元々libディレクトリは自動読み込みの対象でしたが、Rails 3からはデフォルトの自動読み込みパスから除外されました。
その理由として、production環境でeager loadをしたときに問題が発生するケースがあったようです。また、generatorのように、自動読み込みをすることを意図していないものもlibディレクトリにあるため、それらが不必要に読み込まれることを防ぐ意図もありました。
app/lib
ディレクトリというアイディア
自動読み込みをする必要のある、アプリケーションに関わるコードは appディレクトリ配下に置くのが良いというアイディアがありました。 2
しかし、いくつかの理由により、libディレクトリにあるものも自動読み込みしたいケースをサポートするため、今回のメソッドが追加されたようです。
eager loadingについて
production環境等では、アプリケーション起動時に事前に定数を読み込んでおくことで、実行時にファイルを読み込みに行く時間を省略しています。
config.eager_load
がtrue
になるとeager loadingが実行されるようになります。