2011年12月17日土曜日

Railsのソースを読んでみる#3 もう1つのrails

今回は「rails new ****」として出来たディレクトリの「アプリ名/script/rails」を見て行きましょう。
ちなみちRails3.1.3です。

1 #!/usr/bin/env ruby
2 # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3 APP_PATH = File.expand_path('../../config/application', __FILE__)
4 require File.expand_path('../../config/boot', __FILE__)
5 require 'rails/commands'

3行目では「アプリ名/config/application」というパスをAPP_PATHに格納しています。
そして「アプリ名/config/boot.rb」を読み込み、「rails/commands」(こちらはrailtieの方)を読み込んでいます。

まずは「boot.rb」

1 require 'rubygems'
2
3 # Set up gems listed in the Gemfile.
4 ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
5
6 require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])

ここでは環境変数「BUNDLE_GEMFILE」に「アプリ名/Gemfile」を格納しています。
そして「bundler/setup」を読み込みます。
ここでやっているのはファイル名から分かるとうりGemfileで定義した各種モジュールを読み込んでいます。
bundler/setup.rb にて「Bundler.setup」をコールします。これは1つうえの階層の「bundler.rb」にあります。
こちらを読んでいきましょう。

101 def setup(*groups)
102 # Just return if all groups are already loaded
103 return @setup if defined?(@setup)
104
105 if groups.empty?
106 # Load all groups, but only once
107 @setup = load.setup
108 else
109 @completed_groups ||= []
110 # Figure out which groups haven't been loaded yet
111 unloaded = groups - @completed_groups
112 # Record groups that are now loaded
113 @completed_groups = groups
114 # Load any groups that are not yet loaded
115 unloaded.any? ? load.setup(*unloaded) : load
116 end
117 end

この時点ではgroupsは指定しないし@setupも空なので107行目が実行されます。
loadというのはRuntimeクラスのインスタンスを返してくるメソッドで、そのsetupメソッドを呼んでいます。
そのRuntimeというのはどっから来るんだ、というと同ファイルのもっと上の方にあります。

18 autoload :Definition, 'bundler/definition'
19 autoload :Dependency, 'bundler/dependency'
20 autoload :Dsl, 'bundler/dsl'
21 autoload :Environment, 'bundler/environment'
22 autoload :GemHelper, 'bundler/gem_helper'
23 autoload :Graph, 'bundler/graph'
24 autoload :Index, 'bundler/index'
25 autoload :Installer, 'bundler/installer'
26 autoload :LazySpecification, 'bundler/lazy_specification'
27 autoload :LockfileParser, 'bundler/lockfile_parser'
28 autoload :RemoteSpecification, 'bundler/remote_specification'
29 autoload :Resolver, 'bundler/resolver'
30 autoload :Runtime, 'bundler/runtime'
31 autoload :Settings, 'bundler/settings'
32 autoload :SharedHelpers, 'bundler/shared_helpers'
33 autoload :SpecSet, 'bundler/spec_set'
34 autoload :Source, 'bundler/source'
35 autoload :Specification, 'bundler/shared_helpers'
36 autoload :UI, 'bundler/ui'

autoloadというのは最初の引数に指定した名前を参照したタイミングでrequireするメソッドです。
なので「Runtime.new」とされた時点で30行目の「bundler/runtime」が読み込まれます。
この中ではGemfileで指定しているファイルを順次ロードしているだけなので詳細はパス。

「rails/commands」の方は次回見てみるのだ。

0 件のコメント:

コメントを投稿