18
1
記事投稿キャンペーン 「Rails強化月間」

Rails 7.1でlibディレクトリを自動読み込みするデフォルトプラクティスが決まった

Posted at

libディレクトリの自動読み込み方法として、Rails 7.1で新たに、config.autoload_libというメソッドが追加されました。

今まで、

  • libディレクトリ以下全てをconfig.eager_load_pathsに追加していたり
  • app/libディレクトリを作成したり

といった方法があり、Railsのデフォルトでlib配下を自動読み込みする方法を推奨していませんでしたが、Rails v7.1からconfig/application.rbに以下のように記述する方法がデフォルトとなりました。

config/application.rb
  config.autoload_lib(ignore: %w(assets tasks))

v7.0 (やそれ以前のバージョン) でも、以下のように記述したものと同義となります。

config/application.rb
    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_loadtrueになるとeager loadingが実行されるようになります。

参考

  1. https://github.com/rails/rails/issues/37835#issuecomment-977747318

  2. rails 6 lib folder doesn't work #37835
    Create an app/lib directory when generating a new Rails project #47843

18
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
1