秘伝のタレ化していたmodule-setupをDist::Zilla化してみた (仮)

今まで秘伝のタレ化したmodule-setupのテンプレでモジュールのひな形を生成してたんですが、なういMakefile.PLやBuild.PLの書き方とかcpanfileとかMYMETA.*とかそのへんもろもろに追従するのがしんどくなってきたので、milla (Dist::Milla) を元に秘伝のタレをポーティングしてみたメモです。

Dist::Zillaの作法がまだよくわかってないんで、変なところがあったら指摘もらえるとうれしいです。

Milla相当のデフォルトプロファイルを用意

milla の資産はありがたく頂戴したいので、mill new Foo-Bar = dzil new -P Milla Foo-Bar 相当になるようなデフォルトプロファイルを作ります。

$ mkdir -p ~/.dzil/profiles/default
$ vi ~/.dzil/profiles/default/profile.ini
# https://github.com/miyagawa/Dist-Milla/blob/master/profiles/default/profile.ini
# と同じ内容にします。

$ vi ~/.dzil/profiles/default/Module.pm.template
# https://github.com/miyagawa/Dist-Milla/blob/master/profiles/default/Module.pm.template
# と同じ内容にします。

モジュールのひな形ファイルをいじる

先程作った Module.pm.template を好きにいじればよいです。

  • {{$name}} → Foo::Bar
  • {{$dist}} → Dist::Zillaのインスタンス
  • {{$dist->name}} → Foo-Bar

に置換されます。


PodWeaverを使うとPODの記述量を減らしたり「=method」といった記法も使えるようになりますが、git repos上のPODが変換前のであるのが自分は気持ち悪かったので使いませんでした。

ひな形ファイルの追加

milla (Dist::Zilla::Plugin::Milla::MintFiles) により、以下のファイルが new したときに生成されます。

  • dist.ini
  • Changes
  • .gitignore
  • cpanfile
  • t/basic.t

幾つかのファイルはオレオレ用にいじりたかったので、Milla::MintFiles は使わずに GatherDir::Template で生成するようにしました。

$ vi ~/.dzil/profiles/default/profile.ini
-[Milla::MintFiles]
+[GatherDir::Template]
+root = skel
+include_dotfiles = 1
+
+[DistINI]
+append_file = plugins.ini

# Milla::MintFiles を消す
# GatherDir::Template を追加
# DistINI を追加

$ mkdir ~/.dzil/profiles/default/skel
$ vi ~/.dzil/profiles/default/skel/Changes
Revision history for {{$dist->name}}

{{ '{{$NEXT}}' }}
    [NEW FEATURES]
    [IMPROVEMENTS]
    [INCOMPATIBLE CHANGES]
    [BUG FIXES]
    [DOCUMENTATION]
    [SECURITY]
        - Initial version

$ vi ~/.dzil/profiles/default/skel/.gitignore
/{{$dist->name}}-*
/.build
/_build*
/Build
MYMETA.*
!META.json
/.prove
# ...あとはお好みで追加...

$ vi ~/.dzil/profiles/default/skel/cpanfile
requires 'perl', '5.008005';

# requires 'Some::Module', 'VERSION';

on test => sub {
    requires 'Test::More', '0.88';
};
# ...あとはお好みで追加...

$ vi ~/.dzil/profiles/default/skel/t/xxx.t
# お好みで追加


$ vi ~/.dzil/profiles/default/plugins.ini
[@Milla]

pmを生成したTemplateModule/:DefaultModuleMakerと違い、GatherDir::Template では直で「Foo::Bar」を得る方法が無いので、t/* なファイルとかではこうしています。

require {{ (my $mod = $dist->name) =~ s/-/::/g; $mod }};
と書いとくと、
require Foo::Bar;
になる

CPANで見つけたTest系のPluginを追加する

$ vi ~/.dzil/profiles/default/profile.ini
+[Test::Perl::Critic]
+[Test::Fixme]
+[Test::Kwalitee]
+[Test::UnusedVars]
+[ExtraTests]

これで dzil new したときに、t/ 下に

  • author-critic.t
  • release-fixme.t
  • release-kwalitee.t
  • release-unused-vars.t

というファイルが作られます。


dist.iniに [Test::Perl::Critic] などを書くと、dzil newしたときには t/* ファイルは生成されず、dzil testやbuildしたときに生成されるようになるのですが、いまいちあとから生成する意義がわからない(release時にt/{release,author}-*.tをtar.gzに含めない、とかならわかるんですがそうでもないようなので)ので、dzil new時に生成するようにしています。

PodSyntaxTests

PodSyntaxTests = t/release-pod-syntax.t が new 時ではなく build 時に生成されます。これは dist.ini で指定している [@Milla] である Dist::Zilla::PluginBundle::Milla がそうしているからです。

前掲の理由で new 時に生成したいので、profile.ini に追加します。

$ vi ~/.dzil/profiles/default/profile.ini
 [Test::Fixme]
 [Test::Perl::Critic]
 [Test::Kwalitee]
+[PodSyntaxTests]
 [ExtraTests]

これだけだと new したときに、

[DZ] attempt to add t/release-pod-syntax.t multiple times; added by: @Milla/Git::GatherDir (Dist::Zilla::Plugin::Git::GatherDir line 81); @Milla/PodSyntaxTests (Dist::Zilla::Plugin::InlineFiles line 29)

と怒られるので、plugins.iniを編集して [@Milla] から PodSyntaxTests を抜きます。

$ vi ~/.dzil/profiles/default/plugins.ini
-[@Milla]
+[@Filter]
+-bundle = @Milla
+-remove = PodSyntaxTests

Test::PodSpelling

Test::PodSpelling (https://metacpan.org/release/Dist-Zilla-Plugin-Test-PodSpelling) を追加したいと思い、profile.ini に追加したのですがエラーになります。

[DZ] making target dir /var/tmp/r/Foo-Bar
[DZ] no version was ever set at /usr/local/lib/perl/5.10.1/Moose/Meta/Method/Delegation.pm line 110.
[DZ] no version was ever set

エラーメッセージの意味がいまいちわかりませんが、原因は DZ::Plugin::Test::PodSpelling はmintingするためのminter pluginではない、ということのようです。

しかたないので、一旦、dist.ini に [Test::PodSpelling] と書いて dzil build で生成された t/author-pod-spell.t を ~/.dzil/profiles/default/skel/t/author-pod-spell.t としてコピーして new 時に生成されるようにしました。

oreno profile

結局、どうなったかは

に置いてあります。