人気ブログランキング | 話題のタグを見る

RoR config/boot.rb GemBoot

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)
<< tempfile を利用した ... RoR config/boot... >>