2009年8月23日日曜日

[Rails][CodeReading] Rails::Initializer (7) add_plugin_load_paths

Initializer.process で7番目に呼ばれる add_plugin_load_paths メソッド。

def add_plugin_load_paths
plugin_loader.add_plugin_load_paths
end

plugin_loader (実体はRails::Plugin::Loader) に委譲されているので、そちらをみてみます。

# rails-2.3.3/lib/rails/plugin/loader.rb
def add_plugin_load_paths
plugins.each do |plugin|
plugin.load_paths.each do |path|
$LOAD_PATH.insert(application_lib_index + 1, path)

ActiveSupport::Dependencies.load_paths << path

unless configuration.reload_plugins?
ActiveSupport::Dependencies.load_once_paths << path
end
end
end

$LOAD_PATH.uniq!
end

plugins というのは Rails::Plugin の配列で、Plugin.load_paths というのが $LOAD_PATH や ActiveSupport::Dependencies.load_paths に追加されています。その Plugin.load_paths の正体がこれ。

# rails-2.3.3/lib/rails/plugin.rb
module Rails
class Plugin
~~ 略 ~~
def initialize(directory)
@directory = directory
@name = File.basename(@directory) rescue nil
@loaded = false
end
~~ 略 ~~
def load_paths
report_nonexistant_or_empty_plugin! unless valid?

returning [] do |load_paths|
load_paths << lib_path if has_lib_directory?
load_paths << app_paths if has_app_directory?
end.flatten
end
~~ 略 ~~
private
def app_paths
[ File.join(directory, 'app', 'models'), File.join(directory, 'app', 'helpers'), controller_path, metal_path ]
end

def lib_path
File.join(directory, 'lib')
end
end
end


[Rails][CodeReading] Railsの初期化コードを読む (イントロ&目次)

0 件のコメント:

コメントを投稿