Rails の自動読み込みを支える技術

16,495 views
17,534 views

Published on

ActiveSupport::Dependencies のソースを読むので簡単に紹介しました。

文章で説明したバージョンはこちらに用意しました。

http://blog.eiel.info/blog/2013/09/07/autoload-rails/

Published in: Technology, Education

Rails の自動読み込みを支える技術

  1. 1. Rails の 自動読み込み を支える技術 2013-09-07 広島Ruby勉強会 #034 13年9月7日土曜日
  2. 2. Rails の読み込み規約 •Hoge -> hoge.rb •HogeMogu -> hoge_mogu.rb •Hoge::Mogu -> hoge/mogu.rb 13年9月7日土曜日
  3. 3. 名前の変換 •ActiveSupport::Inflector.underscore •Core Extention •String#underscore 13年9月7日土曜日
  4. 4. 関連モジュール •ActiveSupport::Dependencies •ActiveSupport::Autoload 13年9月7日土曜日
  5. 5. ActiveSupport::Dependencies 13年9月7日土曜日
  6. 6. 自動読み込み •Rails 用のコードはクラス名から自動読 み込みできる •RAILS_ROOT/app/models/... •RAILS_ROOT/app/helpers/... •... 13年9月7日土曜日
  7. 7. RAILS_ROOT/lib など自動は読み込みできない 13年9月7日土曜日
  8. 8. Rails を使わない場合 require 'active_support/dependencies.rb' ActiveSupport::Dependencies.autoload_paths << 'lib' 13年9月7日土曜日
  9. 9. lib から自動読み込みが できるようになります 13年9月7日土曜日
  10. 10. ライブラリなどでは使わない •自作ライブラリで規約に沿った読み込み は ActiveSupport::Autoload を使う •アプリケーションの記述をシンプルにす るために使う? 13年9月7日土曜日
  11. 11. Rails での初期値 • RAILS_ROOT/app/assets • RAILS_ROOT/app/controllers • RAILS_ROOT/app/helpers • RAILS_ROOT/app/mailers • RAILS_ROOT/app/models • RAILS_ROOT/app/controllers/concerns • RAILS_ROOT/app/models/concerns 13年9月7日土曜日
  12. 12. 仕組み •ConstMissing に処理を追加 •autoload_paths の中にあるか確認 •あれば読み込み •なければ ConstMissing 発生 13年9月7日土曜日
  13. 13. 動作をみたいなら •Logger を設定 •log_activity = true に設定 •Rails の場合は Logger は設定済み 13年9月7日土曜日
  14. 14. Logger を使う require 'active_support/dependencies.rb' require 'logger' ActiveSupport::Dependencies.logger = Logger.new($stderr) ActiveSupport::Dependencies.log_activity = true 13年9月7日土曜日
  15. 15. require するだけで使える • 読み込み時に呼んでるメソッドがある • ActiveSupport::Dependencies.hook! • 止めたい場合は • ActiveSupport::Dependencies.unhook! 13年9月7日土曜日
  16. 16. 知ってると便利かも 13年9月7日土曜日
  17. 17. ActiveSupport::Dependencies .warnings_on_first_load •はじめて読み込みしたクラス •ログに出力 •二度目は出力しない 13年9月7日土曜日
  18. 18. ActiveSupport::Dependencies .history •読み込みしたクラスが格納 •Set で格納 •順番はわからない 13年9月7日土曜日
  19. 19. ActiveSupport::Dependencies .loaded •読み込みしたクラスがわかる •History との違い •clear されることがある •これも Set 13年9月7日土曜日
  20. 20. ActiveSupport::Dependencies .mechanism •読み込みする時 に •load を使うか (デフォルト) •require を使うか •環境変数 NO_RELOAD を設定で •require に 13年9月7日土曜日
  21. 21. ActiveSupport::Dependencies .explicitly_unloadable_constants •自動読み込みの対象にしない名前を登録 13年9月7日土曜日
  22. 22. ActiveSupport::Autoload 13年9月7日土曜日
  23. 23. ライブラリで規約を利用 •Rails のコードではよく使われている •lib/active_support.rb •lib/active_record.rb 13年9月7日土曜日
  24. 24. autoload を拡張 •Kernel.autoload(module, filename) •Module.autoload(module, filename) •引数が2つ必要 13年9月7日土曜日
  25. 25. autoload を拡張 • ActiveSupport::Autoload • #autoload(const_name, path = @@at_path) • 第2引数が オプションに 13年9月7日土曜日
  26. 26. autoloadについて •あるクラスが必要になった時にはじめて ファイルを読み込みする •第1引数 あるクラスの名前 •第2引数 読み込みするファイル 13年9月7日土曜日
  27. 27. 第2引数は 規約から推測可能 13年9月7日土曜日
  28. 28. Kernelのほうはそのまま 13年9月7日土曜日
  29. 29. Module のほうだけ拡張 13年9月7日土曜日
  30. 30. 例 require 'active_support/dependencies/autoload' module Hoge extend ActiveSupport::Autoload autoload :Mogu end Hoge::Mogu # > LoadError: cannot load such file -- hoge/mogu 13年9月7日土曜日
  31. 31. eager_autoload と autoload! 13年9月7日土曜日
  32. 32. よくある光景 eager_autoload do autoload :Hoge autoload :Mogu end 13年9月7日土曜日
  33. 33. auto_load! •eager_autoload の中にかいておくと auto_load! でまとめて読み込みできる •利点がはっきりとわからないです •知ってたら教えて 13年9月7日土曜日
  34. 34. ご清聴ありがとうございます 13年9月7日土曜日

×