Module::StarterのテンプレートをTemplate-Toolkitを使って書く

昔ちらっと書いたことがあるのですが、Module::Starter::PBPはテンプレート内で変数をいじることができないので、代わりにModule::Starter::Plugin::TT2を使うことにしました。これで自前プラグインを作らなくても、Template-Toolkitのテンプレート機能で何とかできるようになります。

M::S::P::TT2では、テンプレートをどのような形式で置くかをModule-Starter-Plugin-SimpleStoreを使って指定します。自分は各テンプレートを別々に管理したいのでM::S::P::DirStoreを使いました。テンプレートファイルの置き方はM::S::PBPのようになります。(他には一つのファイルにインラインで書き込むタイプのM::S::P::InlineStoreとM::S::P::ModuleStoreがあります)

.module-starter/configには

plugins: Module::Starter::Simple Module::Starter::Plugin::Template Module::Starter::Plugin::TT2 Module::Starter::Plugin::DirStore

と書きます。最後の「Module::Starter::Plugin::DirStore」の部分は適宜変更してください。

M::S::P::DirStoreは使用するテンプレートをconfigのtemplate_dirプロパティか環境変数MODULE_TEMPLATE_DIRで指定します。ホームディレクトリを変数で指定したいのですが、configでは変数が使えないため環境変数の方で設定しました。

export MODULE_TEMPLATE_DIR="$HOME/.module-starter/CPAN"     # Module::Starter::Plugin::DirStore

(「CPAN」は単なるディレクトリ名です。)


指定したディレクトリにテンプレートを並列に置きます。階層化しても認識されません。

% \ls $MODULE_TEMPLATE_DIR
00load.t  01perlcritic.t  02pod.t  03pod-coverage.t  04kwalitee.t  Build.PL  Changes  Makefile.PL  Module.pm  README

この状態で

% module-starter --module=MyApp

とすると、

% ack -f MyApp
MyApp/Makefile.PL
MyApp/lib/MyApp.pm
MyApp/t/00load.t
MyApp/t/01perlcritic.t
MyApp/t/02pod.t
MyApp/t/03pod-coverage.t
MyApp/t/04kwalitee.t

となります。*.tで終わるファイルはMyApp/tに格納され、Module.pmはMyApp/lib/MyApp.pmとして格納されます。

ところで上の例ではBuild.PLが含まれていません。Build.PLも含めるためには、configのbuilderプロパティにModule::Buildが含まれている必要があります。

builder: Module::Install Module::Build

これでMyApp/Build.PLも含まれるようになります。
builderプロパティはModule::Build以外は認識されないのですが、Module::Buildしか書かないとBuild.PLだけになり、Makefile.PLが含まれなくなります。なお、builderプロパティの先頭のモジュールがメインのbuilderとなり、READMEで使用できる[% build_instructions %]の説明が変わります。



以上でテンプレートにTemplate-Toolkitの構文が使えるようになりました。
以下実例ですが、例えばREADMEに

perldoc MyApp::Plugin

というのを書きたいのですが、READMEでは[% main_module %]は定義されません。しかし

perldoc [% self.distro.replace('-', '::') %]

のようにすればディストリビューション名からメインモジュール名を得られます。

また、READMEの先頭部分はreStructuredText形式で

MyApp-Plugin
============

と書いているのですが、下線の長さはディストリビューション名によって変動しますので、今までは手で修正していました。これは

[% SET delim = '=' %][% SET delim = delim.repeat(self.distro.length) -%]
[% self.distro %]
[% delim %]

と書けます。