Zeitwerk
Rails 6.0 から標準で導入された定数の自動読み込み機構。
参考:
fxn/zeitwerk: Efficient and thread-safe code loader for Ruby – GitHub
ドキュメント
参考:
Documentation for zeitwerk | RubyDoc.info
概要
参考:
Rails 6 Beta2 時点の Zeitwerk 情報 要訳 | TechRacho
Zeitwerk integration in Rails 6 (Beta 2) | Riding Rails
A new code loader for Ruby | Xavier Noria
Zeitwerk::Loader.eager_load_all
登録されている全てのローダーで eager_load
を実行する。
参考:
Eager loading – fxn/zeitwerk: Efficient and thread-safe code loader for Ruby – GitHub
Method: Zeitwerk::Loader.eager_load_all — Documentation for zeitwerk | RubyDoc.info
zeitwerk/loader.rb at v2.1.5 · fxn/zeitwerk – GitHub
do_not_eager_load
Zeitwerk の eager_load
による読み込みから除外する。
参考:
Method: Zeitwerk::Loader#do_not_eager_load — Documentation for zeitwerk | RubyDoc.info
Bring back the do_not_eager_load feature by casperisfine · Pull Request #22 · fxn/zeitwerk – GitHub
fixes eager loading edge case in :zeitwerk mode · rails/rails@278f0df – GitHub
eager_load から除外する
eager_load: true
を指定したディレクトリ下で除外するディレクトリをexclude
に指定する。
paths.add "app", eager_load: true, glob: "{*,*/concerns}", exclude: %w[assets javascript frontend]
参考:
paths.add “app” – rails/configuration.rb at v6.0.0.rc1 · rails/rails – GitHub
イニシャライザにおける定数読み込み
DEPRECATION WARNING が表示される。
DEPRECATION WARNING: Initialization autoloaded the constants ... Being able to do this is deprecated. Autoloading during initialization is going to be an error condition in future versions of Rails. Reloading does not reboot the application, and therefore code executed during initialization does not run again. So, if you reload ColorHelper, for example, the expected changes won't be reflected in that stale Module object. These autoloaded constants have been unloaded. Please, check the "Autoloading and Reloading Constants" guide for solutions.
参考:
自動読み込みとイニシャライザ | Rails ガイド [公式]
Autoloading and Reloading Constants (Zeitwerk Mode) | Ruby on Rails Guides (Edge) [Official]
take_over – rails/zeitwerk_integration.rb at v6.0.0.rc1 · rails/rails – GitHub
let_zeitwerk_take_over – rails/finisher.rb at v6.0.0.rc1 · rails/rails – GitHub
warn_if_autoloaded – rails/finisher.rb at v6.0.0.rc1 · rails/rails – GitHub
How can I preload concerns in a rails initializer using Rails 6/Zeitwerk? – Stack Overflow
Rails6 で従来の自動読み込みを使用する
config/application.rb
で config.autoloader
に :classic
を指定する。
config.autoloader = :classic
参考:
Classes or modules in explicit namespaces are not found · Issue #35475 · rails/rails – GitHub
ソースコード
参考:
rails/zeitwerk_integration.rb at v6.0.0.rc1 · rails/rails – GitHub
main – rails/autoloaders.rb at v6.0.0.rc1 · rails/rails – GitHub
once – rails/autoloaders.rb at v6.0.0.rc1 · rails/rails – GitHub
inflector – zeitwerk/loader.rb at v2.1.8 · fxn/zeitwerk – GitHub