$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Dist::Maker::FromProjectというのを作りました

最近インターンや研修用にフレームワークを作っています。出来るだけコードを読んで学習してもらうというのを重視して、今回のフレームワークはコードジェネレータでプロジェクトの雛形を作り、その中にフレームワークのコードも含まれるようにしています。

自動生成のためにDist::Makerを利用しているのですが、この場合フレームワークのコードも書きつつ、Dist::MakerのTemplateも書かないといけません。この二重管理が面倒だなーと思い、プロジェクトのディレクトリを指定してその内容からDist::MakerのTemplateを作るモジュールを作りました。

Dist::Maker::FromProject

https://github.com/shibayu36/p5-Dist-Maker-FromProject

このツールはgitで管理されたディレクトリと、変換ルールを指定することでDist::Makerのテンプレートを作ってくれます。

まず変換ルールを作っておきます。

# replace-setting.pl
+{
    "WebApp/Sample"  => '<: $dist.path :>',
    "WebApp::Sample" => '<: $dist.module :>',
    "WebApp-Sample"  => '<: $dist.name :>',
    "webapp_sample"  => '<: $dist.join_with("_") | lower :>',
    "WEBAPP_SAMPLE"  => '<: $dist.join_with("_") | upper :>',
    "webapp.sample"  => '<: $dist.join_with(".") | lower :>',
};

そしてプロジェクトのディレクトリと変換ルールのファイルを指定することで、Dist::MakerのTemplateを出力してくれます。あとはこれを適当なファイルに出力しておけばテンプレートを作れます。

$ dim-from-project --class=WebApp --project-dir=/path/to/WebApp-Sample --config-file=replace-setting.pl

適当に自分のやりたいことが出来ればよかっただけなので、現状は変換ルールの完全一致しかサポートしてません。またCPANにも上げていないので、githubを参照してください。もしかしたらこういうのは、Dist::Makerのdimコマンドに--packみたいなのを作り、それでサポートしているといいのかもしれませんね。