Hanamiのコードリーディングをしました。バージョンは1.2.0です。今回は hanami new のアプリケーションの初期化コマンドのコードを追ってみます

bin/hanamiはHanami::CLI#callを呼び出します

Hanami::CLI#callは以下のように定義されています。コンストラクタでHanami::CLI::Commandsがregistryとして渡されます。

commandはHanami::CLI::Commands::NewのインスタンスなのでHanami::CLI::Commands#callが呼ばれます。

callは以下のように定義されています

プロジェクトディレクトリを作って、その中に移動してから各種ファイルを生成します。

generate_xxxの各メソッドにはHanami::CLI::Commands::Contextのオブジェクトを渡しています。これは各ファイル生成に必要なパラメータをまとめたOpenStructのクラスになります。ファイル生成はerbでレンダリングされますが、レンダリング時のコンテキストがこのオブジェクトになります。

例えば、#generate_application_templatesでは以下のように#generate_fileを呼び出してファイルを生成します。

#generate_fileは#renderを使ってファイルの中身を生成して、Hanami::Utils::Files#writeで書き出します。

Hanami::Utils::Files#writeは以下のように定義されています。openの呼び出しはKernel#openではなく、Hanami::Utils::Files#openです。

ERBによるレンダリングはHanami::CLI::Commands::Renderer#call内のERB#resultで行われます。

おまけ

ちなみにRailsのように bundle exec hanami new . というようにカレントディレクトリの中にHanamiを展開することは現段階ではできないようです。カレントディレクトリに展開するPRを投げてみたのですが過去にもやりとりが有って通らなかったっぽいですね…