middleman を読む手順
結構複雑で、難しいです。
- rack / middleware
- module, extend など ruby の詳細
- hook の動き
などについての知識が必要になります。
根幹となる機能も “core-extensions” と拡張機能扱いで実装されているので、
追っていくのがなかなか大変です。
手順として、
- まず console で触る
- サンプルスクリプトを書き、簡単な拡張機能を書いてみる
- middlemanのソース一式を手元に落とし、pry や printf デバッグなどでひとつずつ追っていく
という方法を取ります。
console で中身を見る
まずは middleman console で中身を見ながら追っていきます。
インストールと下準備
シンプルなシステム構成で init します。pry はソースを追うのに必要なのでいれておきます。
|
|
app (Middleman::Application)
console を起動し、self を見ます。
|
|
Middleman::Application というのがアプリケーション用のクラス。箱。
これに後述の拡張機能を登録しフックを仕込み、順次駆動させていく形になります。
このクラスにextend バリバリつかって module を組み込んでいくため、
他のリクエスト、プロセスとの混乱しないよう、
リクエストごとに Middleman::Application::MiddlemanApplication1というように番号を振った派生クラスを作り、
それを利用していくことになります。
sitemap (Middleman::Sitemap::Store), resources[] (Middleman::Sitemap::Resource)
次に sitemap と sitemap.resources を見ます:
|
|
- Middleman::Sitemap::Store:source/ 以下のデータを管理するコンテナクラス、
- Middleman::Sitemap::Resource:それぞれのファイルなどのリソースのコンポーネントクラス。
この2つがキモとなります。
特定のリソースを取り出すには、sitemap.find_resource_by_path() を使います:
|
|
これで page で特定のリソース(“/index.html”)のデータやパスなどの情報にアクセスできます。また render でテンプレートに従い加工されたテキストが返ります。
|
|
Middleman::Application クラス
Middleman::Application クラスを見てみます。
define hooks
37行目あたり にhook の定義がされています。
|
|
ここでは4つのみですが、後ほどもっと出てきます。
core-extensions の register
142行目あたり から、いよいよ extensions の register が行われていきます。
まず、”include Middleman::CoreExtensions::Extensions” してますが、このモジュールには register()関数が定義されてて、これを使うことにより拡張機能(extension)を登録(register)することができます。詳しくは後述します。
このregister 関数を使って Middleman::CoreExtensions::Request, ShowException, FileWatcher… などの「コアな」extension をどんどん登録してきます。
拡張機能の仕組み
主な機能としては、
- ヘルパー関数の提供
- フックの仕込み
があります。
簡単な拡張機能を作りながら、動きを追っていきます。
ヘルパー関数
helpers/hello.rb
簡単なのは、helpers/ 以下のファイルに規則にそって定義することです:
|
|
こうすると、Middleman::CoreExtensions::ExternalHelpers で require され
Middleman::Extensionのhelpers
を使って module し app 内に組み込まれます(app.class.send(:include, m))。
簡単な extension
次に extension でやってみます。
|
|
Middleman::Extension から派生させたクラスを作り、同様に helper 関数を組み込みます。
config.rb でそれを require し activate (後述)させれば、hello() 関数が使えるようになります。
手を加える
|
|