最近インターンや研修用にフレームワークを作っています。出来るだけコードを読んで学習してもらうというのを重視して、今回のフレームワークはコードジェネレータでプロジェクトの雛形を作り、その中にフレームワークのコードも含まれるようにしています。
自動生成のために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みたいなのを作り、それでサポートしているといいのかもしれませんね。