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読んだら
トップレベルへ行くぞぉー」ぐらい?
大雑把にもほどがあるけど、今回はここまで。