config/boot.rb の GemBoot クラスの load_initializer メソッドは最初に self.class.load_rubygems を呼び出している。これは RubyGems をロードするメソッドだが、次のような記述になっている。
def load_rubygems require 'rubygems' min_version = '1.1.1' unless rubygems_version >= min_version $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.) exit 1 end rescue LoadError $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org) exit 1 end require 'rubygems' を実行するだけだが、RubyGems のバージョンが 1.1.1 未満ならエラーメッセージを出して異常終了する。RubyGems のバージョンを取得するメソッドが rubygems_version だが次のようなコードだ。 def rubygems_version Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion end RubyGems の Gem::RubyGemsVersion を参照しているだけだ。これは、irb で簡単に確かめることができる。 irb(main):001:0> require 'rubygems' => false irb(main):002:0> Gem::RubyGemsVersion => "1.3.0" load_initializer では次に load_rails_gem を呼び出している。コードは次のようになる。 def load_rails_gem if version = self.class.gem_version gem 'rails', version else gem 'rails' end rescue Gem::LoadError => load_error $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.) exit 1 end やっていることは、次のようになる。まず、gem_version メソッドで、RoR のバージョンが、Rubyの定数 RAILS_GEM_VERSION または環境変数 RAILS_GEM_VERSION に定義されているか、それとも config/environment.rb の記述のなかに指定されているかどうか検索する。それから指定されていればそのバージョンを、指定されていなければ最新の Rails のバージョンを gem に指定する。 ここで使われている gem コマンドはライブラリを読み込むのではなく、読み込むライブラリのバージョンを指定するためのものだ。実際の読み込みは、require 'initalizer' で行われる。 gem_version のコードは次のようになるが特に問題になるところはない。 def gem_version if defined? RAILS_GEM_VERSION RAILS_GEM_VERSION elsif ENV.include?('RAILS_GEM_VERSION') ENV['RAILS_GEM_VERSION'] else parse_gem_version(read_environment_rb) end end ENV は環境変数のハッシュのようなもの、ENV.include?('name') で name という名の環境変数があるかどうかをチェックする。 parse_gem_version(read_environment_rb) は、config/environment.rb を読んで Rails のバージョンが設定されていればそれを取り出す。 read_environment_rb のコードは次のようになる。File.read()でファイルを読み込んでいるだけ。 def read_environment_rb File.read("#{RAILS_ROOT}/config/environment.rb") end parse_gem_version は正規表現で config/enironment.rb に記述されたRAILS_GEM_VERSION = '=2.1.0' の '=2.1.0' の部分を読み込んでいる。 def parse_gem_version(text) $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/ end load_initializer は最後に、require 'initializer' を実行しRailsを初期化する。load_initializer を再掲する。 def load_initializer self.class.load_rubygems load_rails_gem require 'initializer' end これで、config/boot.rb のコードの解読は終了だ。要するに RubyGems ライブラリを読み込み、Railsのバージョンを指定し、Railsのライブラリを読み込んでいるだけだった。
by tnomura9
| 2008-10-23 07:44
| Ruby
|
Comments(0)
|
カテゴリ
新型コロナウイルス 主インデックス Haskell 記事リスト 圏論記事リスト 考えるということのリスト 考えるということ ラッセルのパラドックス Haskell Prelude Ocaml ボーカロイド 圏論 jQuery デモ HTML Python ツールボックス XAMPP Ruby ubuntu WordPress 脳の話 話のネタ リンク 幸福論 キリスト教 心の話 メモ 電子カルテ Dojo JavaScript C# NetWalker ed と sed HTML Raspberry Pi C 言語 命題論理 以前の記事
最新のトラックバック
最新のコメント
ファン
記事ランキング
ブログジャンル
画像一覧
|
ファン申請 |
||