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
指定したディレクトリにテンプレートを並列に置きます。階層化しても認識されません。
% \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 %]
と書けます。