Reading Rake (1)

「Rakeはソースコード読解の練習に向いている」とかなんとかいう感じの話を
どっかで見た気がしたので読んでみる。

読むのはRake 0.7.3。

/bin/rake

begin
  require 'rake'
rescue LoadError
  require 'rubygems'
  require 'rake'
end
Rake.application.run

ライブラリのロードとRake.application.runだけだ。

全然余談だけど私はちっともRubyGemsを使いこなせていません。
ライブラリのインストールぐらいは必要に駆られて覚えたけど、
なんだrequire_gemって。
あんまわからなさ過ぎてピッケル本でもGemsのとこだけ読んでないよ。

/lib/rake.rb(一部)

module Rake

  # --------------------------------------------------------------------------
  # Rake module singleton methods.
  #
  class << self
    # Current Rake Application
    def application
      @application ||= Rake::Application.new
    end

    # Set the current Rake application object.
    def application=(app)
      @application = app
    end

    # Return the original directory where the Rake application was started.
    def original_dir
      application.original_dir
    end

  end

らしい。つまり/bin/rakeから呼ばれたRake.applicationは
新しいRake::Applicationオブジェクトを返すだろう。

で、Rake::Applicationの定義を覗きに行くと

  ######################################################################
  # Rake main application object.  When invoking +rake+ from the
  # command line, a Rake::Application object is created and run.
  #

とのことらしいので、当たりっぽい。
(超訳)Rakeアプリケーションの代表っぽいオブジェクト。コマンドライン
`rake'で、Rake::Applicationオブジェクトが生成されてrunされる。


/lib/rake.rb(一部) -- Rake::Application#run

def run
  standard_exception_handling do
    init
    load_rakefile
    top_level
  end
end

いきなり処理全体がstandard_exception_handlingとやらのブロック付き
メソッド呼び出しで囲われている。検索したらそういうメソッドが
Rake::Applicationのインスタンスメソッドには4つほどあった。

名前からして多分StandardErrorあたりから例外をrescueしてうんぬん、って
メソッドだろうなぁ。rakeは--traceオプションをつけると処理のトレースを
出力し、エラーがあると例外が放置プレイされたときにrubyインタプリタ
やるみたいにスタックトレースも見せてくれる。そのへんはここの働きか?

top_level()は何だろう。Rakefile中でp selfしてみたらmainだった
ので、多分トップレベルのコンテキストでごにょごにょ仕事をするんだろう。

run()を言葉にして読み下してみると、
「基本的な例外をどうにかしつつ、初期化してRakefile読んだら
トップレベルへ行くぞぉー」ぐらい?


大雑把にもほどがあるけど、今回はここまで。