Install developper's prerequisites with cpanm

Makefile.PLで開発者用のモジュールを宣言するにはM::I::AuthorRequiresがあるが、これはモジュールがインストールされていなければdieするので、結局は手作業でモジュールをインストールしなければならない。

しかし、今やcpanmがあるので、「モジュールのリスト」さえあればインストールするのは簡単だ。
まず、author/requires.cpanm に以下の用にモジュールをリストする。このリストはcpanmの引数として扱われるので、--verboseなどのcpanmのオプションも書くこともできる。また、コメント(#)も使える。
(この例は Mouse/author/requires.cpanm よりコピペしたもの)

# modules which the authors require:
# $ cpanm < author/requires.cpanm
# see also App::cpanminus (a.k.a. cpanm)

# Module::Install stuff
Module::Install
Module::Install::AuthorTests
Module::Install::XSUtil

# Test stuff
Test::More
Test::Exception
Test::LeakTrace
Test::Output

# required by recipes
Regexp::Common
Locale::US
HTTP::Headers
use Params::Coerce
URI

あとは、このリストについてドキュメントに書くなり、Makefile.PLに細工をするなりすればよい。

たとえば、Makefile.PLに以下のように記述すると、M::I流のauthor modeのときか、--authorオプションを与えたときにこのモジュールリストをインストールできる*1

# スクリプトの冒頭
BEGIN{ if(grep{ $_ eq '--author' } @ARGV){
    system "$^X -S cpanm < author/requires.cpanm";
}}
use Module::Install;
...

単にリストを与える以上のことをしたいときは、App::cpanminus を使ったスクリプトを書いてもいい*2

#!perl
use warnings;
use strict;
use App::cpanminus::script;

my @args = qw(
    Module::Install
    Module::Install::XSUtil
    Test::LeakTrace
);

my $app = App::cpanminus::script->new;
$app->parse_options(@args);
$app->doit;
__END__

*1:3/8 inc/.authorがあるときにcpanmを起動するのは時間がかかりすぎるのでコード修正。インストールを試みるのは--author付きのときだけでよい。

*2:ただし、以下のスクリプトはまだ動かない模様。