CPAN形式で開発する。

 ーー参考(というか、ほぼそのままって言うね)ーー
 モダンPerl入門 (CodeZine BOOKS)

 ちょっとした書き捨てスクリプトならあれですけど、それなりにそれっぽいものをちゃんとテストしながら開発しようとする時にはCPAN形式にしてしまった方が何かと便利です。別に公開する必要はなくても、make test で自動的にテストが実行されるだけで取り入れる価値ありです。
 CPAN形式で開発を行うには、ディレクトリ構成を合わせる事とMakefile.PLというMakefileを作成する為のスクリプトを書かねばなりません。が、普通に始める分には簡単にできるようになっていますよ。

 Spamというモジュールを開発するとしてディレクトリ構成の例を示しますと以下のような感じであります。

Spam
└ Makefile.PL
└ lib
  └ Spam.pm
└ t
  └ 00.t


 それではSpam.pmを作ります。今回はとりあえずなので適当に、

package Spam;

use strict;
use warnings;
use utf8;

our $VERSION = '0.00001';

sub return_eggs {
    'Eggs';
}

1;

くらいで。

 Makefile.PLはMakefileを作成するものですので、環境の情報やら依存関係の情報やらが必要になりますし、もろもろの作業を自動実行する上でも大変重要なので一から自分で書くとなると非常にしんどいのですけど、そこはそれ、ちゃんとそれ用のツールが出回っています。
 最近の流行はModule::Installというモジュールらしいので、それを使うとして、Makefile.PLを以下のように記述しました。

use strict;
use warnings;
use utf8;

use inc::Module::Install;

test_requires('Test::More');

name('Spam');
all_from('lib/Spam.pm');

WriteAll;

 テストの際にはTest::Moreモジュールが必要だよと一応記述。

 Module::Installモジュールは標準モジュールじゃないので、インストールされていないかも知れません。その場合はCPANコマンドなどを用いてインストールします。

risa:Spam tac$ sudo perl -eshell -MCPAN
Password:

cpan shell -- CPAN exploration and modules installation (v1.9402)
Enter 'h' for help.

cpan[1]> install Module::Install

 それでは実行してみます!

risa:Spam tac$ perl Makefile.PL
 ...
Cannot determine perl version info from lib/Spam.pm
Cannot determine author info from lib/Spam.pm
Cannot determine license info from lib/Spam.pm
 ...
Writing Makefile for Spam
Writing META.yml
No license specified, setting license = 'unknown'

 何やら言われてますけど上手く行ったみたいなので、調子にのってテストを書きます。

 今回Makefile.PLと同じ階層に“t”というディレクトリを作って、その中に数字付きで拡張子がこれまた“t”のファイルを作っていますが、Makefile.PLと同じ階層にtest.plというファイルを作ってもテストファイルとして認識してくれます。
 もちろんMakefile.PL内に記述する事によりテストファイルや検索ルールを指定する事もできるらしいです、やった事無いけど。

use strict;
use warnings;
use utf8;

use Test::More;

plan (tests => 2);

use_ok('Spam');
use Spam;
is(Spam::return_eggs(), 'Eggs');

 テストファイルを追加したのでMakefileを作り直す必要が出てきてしまいました。再度Makefile.PLを実行、一応、make cleanを実行してから。

risa:Spam tac$ make clean
rm -f \
 ...
rm -rf \
 ...
mv Makefile Makefile.old > /dev/null 2>&1
risa:Spam tac$ perl Makefile.PL
 ...

 さて、準備が整いましたので、満を持してテストを実行。

risa:Spam tac$ make test
cp lib/Spam.pm blib/lib/Spam.pm
PERL_DL_NONLAZY=1 /opt/local/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/*.t
t/00.t .. ok
All tests successful.
Files=1, Tests=2, 0 wallclock secs ( 0.02 usr 0.00 sys + 0.02 cusr 0.00 csys = 0.04 CPU)
Result: PASS

 テストファイルが一つで、テストが二つ。結果も通ったよ。という有り難いお知らせ! まぁ、この程度ならあれですが。

 実装が進む度にテストを追加していったり、機能ごとにテストファイルも分けていったりすると良いかもですね。複数のテストファイルを作っても、make testとやるだけでつらつらと実行してくれますから大変助かります。

 適当にも書けるけど、こんなかっちりとした仕組みも用意してくれているPerl界隈、素敵です。みんなテストやりましょう。