2009年8月22日土曜日

[Rails][CodeReading] Rails::Initializer (4) add_gem_load_paths

Initializer.process で4つめに呼ばれる add_gem_load_paths メソッド。

def add_gem_load_paths
Rails::GemDependency.add_frozen_gem_path
unless @configuration.gems.empty?
require "rubygems"
@configuration.gems.each { |gem| gem.add_load_paths }
end
end

Configuration.gems は、デフォルトでは空です。

def default_gems
[]
end


Configuration に gem というメソッドがあり、

def gem(name, options = {})
@gems << Rails::GemDependency.new(name, options)
end

environment.rb に、

# Specify gems that this application depends on and have them installed with rake gems:install
# config.gem "bj"

という説明があるので、 config.gem を書いておくと Configuration.gems に Rails::GemDependency が追加される仕組みになっているようです。

GemDependency.add_load_paths はどうなっているかというと

class GemDependency < Gem::Dependency
~~ 略 ~~
def add_load_paths
self.class.add_frozen_gem_path
return if @loaded || @load_paths_added
if framework_gem?
@load_paths_added = @loaded = @frozen = true
return
end
gem self
@spec = Gem.loaded_specs[name]
@frozen = @spec.loaded_from.include?(self.class.unpacked_path) if @spec
@load_paths_added = true
rescue Gem::LoadError
end
end


たぶん、8行目あたりの gem self がポイント。

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

0 件のコメント:

コメントを投稿