Perl
Perl5
PerlDay 12

Strawberry Perl に Minilla をインストールする

Minilla に Pull Request を送った話を思い出しつつ書いていきます。

Strawberry Perl + Minilla

皆さんはperl5をインストールした後、どのモジュールをインストールしますか?
自分は、 Minilla を早い段階でインストールしています。

Minilla は Perl Module 作成時のひな形作成や CPAN への Upload に使えるツールです。
ちょっとしたスクリプトであっても、 Minilla のひな形に合わせておく事で配りやすくなったりテストしやすくなったりと面倒が減ります。

が、 Windows で Strawberry Perl 使っているとテストが Fail する(※)のでちょっと難儀します。
※ Fail しない人もいるようなのが謎ですが・・・

$ cpanm -v Minilla
(略)
#   Failed test 'use Acme::Speciality;'
#   at t/00_compile.t line 4.
#     Tried to use 'Acme::Speciality'.
#     Error:  Can't locate Acme/Speciality.pm in @INC (you may need to install the Acme::Speciality module) (@INC contains: C:\Users\appveyor\AppData\Local\Temp\1\TQpJM_Zwu1\Acme-Speciality\blib\arch C:\Users\appveyor\AppData\Local\Temp\1\TQpJM_Zwu1\Acme-Speciality\blib\lib C:\projects\minilla\lib C:/projects/minilla/local/lib/perl5/MSWin32-x64-multi-thread C:/projects/minilla/local/lib/perl5 C:/Strawberry/perl/site/lib/MSWin32-x64-multi-thread C:/Strawberry/perl/site/lib C:/Strawberry/perl/vendor/lib C:/Strawberry/perl/lib .) at t/00_compile.t line 4.
# BEGIN failed--compilation aborted at t/00_compile.t line 4.
# Looks like you failed 1 test of 1.
        #   Failed test at t/module_maker/tiny/run_tests.t line 44.
        #          got: '256'
        #     expected: '0'
(略)

以下を見ても、成功したり失敗したりという感じです。
失敗する環境は常に失敗しているようで、同じ Strawberry Perl でも成功している人もいて良く分かりません。
Perl の Version にもあまり関連がないようです。
古くは Minilla v2.1.3 (2014/10/10) から NG レポートが存在している歴史ある Fail です。

失敗している箇所は、ほぼ前述の Can't locate Acme/Speciality.pm in @INC の部分です。
デバッガを使って絞り込みを行ったところ、 rel2abs('blib/lib') の戻り値が意図しない値となっていました。

rel2abs('blib/lib') → 意図していない値
-> C:\Users\appveyor\AppData\Local\Temp\1\s3pxOjl_wU\Acme-Speciality\blib\lib

rel2abs('blib/lib', cwd) → 期待する値
-> C:\Users\appveyor\AppData\Local\Temp\1\s3pxOjl_wU\Acme-Speciality\_build\wvabrXvx\blib\lib

rel2abs('blib/lib', getcwd) → 期待する値
-> C:\Users\appveyor\AppData\Local\Temp\1\s3pxOjl_wU\Acme-Speciality\_build\wvabrXvx\blib\lib

このエラーは恐らく Strawberry Perl でだけ発生しているようで、 例えば travis-ci の linux 環境だと↑の3つの記述は同じ結果を返します。
Minilla 内のソースを rel2abs('blib/lib', cwd) に直すと期待する動作(ubuntuとかと同じ)になったので、PR → Merge となりました。
完全な理解ができていないのが苦しい所ですが、長い期間にわたって Fail し続けた原因をようやく取り除くことができました。

minil.png

既にPRを投げてMergeもされているので、いずれはCPAN側のファイルも更新されるかと思います。
現状はgithubから、以下のようにして直接インストールすると良いです。

$ cpanm -v https://github.com/tokuhirom/Minilla.git

2017/12/15 追記

CPAN側 も更新されましたので、以下のようにインストール可能です。
@skaji さん、ありがとうございます。

$ cpanm -v Minilla

狙い通り、 mswin32 のテストもすべて PASS しています!

まとめ

Strawberry Perl で Minilla のテストが Fail して困っている人は、 github から直接入れると良いです。
Minilla 3.0.13 の次 Version 以降は、 CPAN からインストールできるようになる予定です。

Strawberry Perl でも Minilla が気持ちよくインストールできるようになりました。
Minilla 使って、どんどんライブラリを書きましょう。

リンク