developmentを実現したいのでコードを読んでみる#3
昨日は、ActionDispatch::Reloader で使われている ActiveSupport::Callbacks のドキュメントを読みました。
今日はそれが ActionDispatch::Reloader でどう使われているのかを追いかけたいと思います。
https://github.com/rails/rails/blob/3-1-stable/actionpack/lib/action_dispatch/middleware/reloader.rb
まず定義されているコールバックは、 :prepare と :cleanup の2つです。
どちらも :scope => :name というオプションが指定されているので、コールバックで呼び出されるのがオブジェクトの場合、それぞれ#prepare と #cleanup メソッドが呼び出されます。
で、コールバックを登録するのは、 to_prepare と to_cleanup というクラスメソッドです。
なので、to_prepare, to_cleanup, prepare!, cleanup! を呼び出している箇所が分かればいいような予感がします。
to_prepare
-*- mode: grep; default-directory: "~/.rvm/gems/ruby-1.9.2-head@tengine_console/gems/" -*- Grep started at Wed Jan 11 00:42:47 grep -nr to_prepare actionpack-3.1.3/lib railties-3.1.3/lib actionpack-3.1.3/lib/action_dispatch/middleware/callbacks.rb:11: delegate :to_prepare, :to_cleanup, :to => "ActionDispatch::Reloader" actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:34: def self.to_prepare(*args, &block) railties-3.1.3/lib/rails/application/finisher.rb:22: initializer :add_to_prepare_blocks do railties-3.1.3/lib/rails/application/finisher.rb:23: config.to_prepare_blocks.each do |block| railties-3.1.3/lib/rails/application/finisher.rb:24: ActionDispatch::Reloader.to_prepare(&block) railties-3.1.3/lib/rails/application/finisher.rb:59: # Force routes to be loaded just at the end and add it to to_prepare callbacks railties-3.1.3/lib/rails/application/finisher.rb:65: ActionDispatch::Reloader.to_prepare(&reloader) railties-3.1.3/lib/rails/railtie/configuration.rb:55: # Array of callbacks defined by #to_prepare. railties-3.1.3/lib/rails/railtie/configuration.rb:56: def to_prepare_blocks railties-3.1.3/lib/rails/railtie/configuration.rb:57: @@to_prepare_blocks ||= [] railties-3.1.3/lib/rails/railtie/configuration.rb:62: def to_prepare(&blk) railties-3.1.3/lib/rails/railtie/configuration.rb:63: to_prepare_blocks << blk if blk railties-3.1.3/lib/rails/railtie.rb:77: # # Add a to_prepare block which is executed once in production railties-3.1.3/lib/rails/railtie.rb:79: # config.to_prepare do
to_cleanup
-*- mode: grep; default-directory: "~/.rvm/gems/ruby-1.9.2-head@tengine_console/gems/" -*- Grep started at Wed Jan 11 00:44:47 grep -nr to_cleanup actionpack-3.1.3/lib railties-3.1.3/lib actionpack-3.1.3/lib/action_dispatch/middleware/callbacks.rb:11: delegate :to_prepare, :to_cleanup, :to => "ActionDispatch::Reloader" actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:40: def self.to_cleanup(*args, &block) railties-3.1.3/lib/rails/application/bootstrap.rb:55: ActionDispatch::Reloader.to_cleanup do
parepare!
-*- mode: grep; default-directory: "~/.rvm/gems/ruby-1.9.2-head@tengine_console/gems/" -*- Grep started at Wed Jan 11 00:45:24 grep -nr "prepare!" actionpack-3.1.3/lib railties-3.1.3/lib actionpack-3.1.3/lib/action_controller/metal/testing.rb:21: @_response.prepare! actionpack-3.1.3/lib/action_dispatch/http/response.rb:192: alias prepare! to_a actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:23: # middleware stack, but are executed only when +ActionDispatch::Reloader.prepare!+ actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:45: def self.prepare! railties-3.1.3/lib/rails/application/finisher.rb:41: ActionDispatch::Reloader.prepare! railties-3.1.3/lib/rails/console/app.rb:30: ActionDispatch::Reloader.prepare!
cleanup!
-*- mode: grep; default-directory: "~/.rvm/gems/ruby-1.9.2-head@tengine_console/gems/" -*- Grep started at Wed Jan 11 00:45:58 grep -nr "cleanup!" actionpack-3.1.3/lib railties-3.1.3/lib actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:24: # or +ActionDispatch::Reloader.cleanup!+ are called manually. actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:50: def self.cleanup! actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:62: ActionDispatch::Reloader.cleanup! railties-3.1.3/lib/rails/console/app.rb:29: ActionDispatch::Reloader.cleanup!
それぞれ調べないといけないんですが、
railties-3.1.3/lib/rails/console/app.rb:29: ActionDispatch::Reloader.cleanup! railties-3.1.3/lib/rails/console/app.rb:30: ActionDispatch::Reloader.prepare!
で、rails consoleでの reload! の実装として使われているのが発見できました。
https://github.com/rails/rails/blob/3-1-stable/railties/lib/rails/console/app.rb
今日はハードな一日だったのでまた明日。
rails new --devの使い方
$ git clone https://github.com/rails/rails.git $ cd rails/ $ git branch -r $ git checkout 3-2-stable $ cd .. $ ruby rails/railties/bin/rails new rails3_20120110 --dev
これでcloneしたリポジトリの(3-2-stableブランチ)を参照するrailsアプリが生成できます。
http://edgeguides.rubyonrails.org/3_0_release_notes.html#living-on-the-edge