Module::Install::CPANfileと同じ事をModule::Buildでもやりたい
Build.PL
use Module::Build;
use Module::CPANfile;
my $file = Module::CPANfile->load("cpanfile");
my $prereq = $file->prereq_specs;
my $build = Module::Build->new(
license => 'perl',
dynamic_config => 0,
configure_requires => $prereq->{configure}->{requires},
build_requires => {
$prereq->{build} ? %{$prereq->{build}->{requires}} : (),
$prereq->{test} ? %{$prereq->{test}->{requires}} : (),
},
requires => $prereq->{runtime}->{requires},
no_index => { 'directory' => [ 'inc' ] },
name => 'Foo-Bar',
module_name => 'Foo::Bar',
test_files => (-d '.git' || $ENV{RELEASE_TESTING}) ? 't/ xt/' : 't/',
recursive_test_files => 1,
create_readme => 1,
create_license => 1,
);
$build->create_build_script();
cpanfile
requires 'LWP::UserAgent' => '6.02';
requires 'HTTP::Message' => '6.04';
on 'test' => sub {
requires 'Test::More' => '0.98';
};
on 'configure' => sub {
requires 'Module::Build' => '0.38';
requires 'Module::CPANfile' => '0.9010';
};
Build.PLがModule::CPANfileに依存するようになるのだが、META.{yml,json}のconfigure_requires(CPAN Meta Spec 2では {prereqs}->{configure})にModule::CPANfileが追加されるので事前に導入されてなくても自動で依存解決され、モジュールのインストールができるはず。ただし、cpanm 1.6002以上じゃないとCPAN Meta Spec 2の{prereqs}->{configure}に対応していないので注意です
追記
Module::Buildは0.3800からCPAN Meta Spec 2 でMETA.jsonを書き出すようになってます。ただしMETA.ymlは今まで通りのMeta Spec 1.4になっています。
YAMLがSpec 1.xで、JSONがSpec 2なのは後方互換性のためのようです。Spec 2ではJSONが優先フォーマットなので新しいツールはMETA.jsonを使い、古いツールはMETA.ymlしかみません。
cpanmの 1.5_11 で META.jsonを読み込む変更が入った際に Spec 2の prereqsではなくconfigure_requiresを参照していた問題がありましたが、1.6002 で修正されたので今は安心して使えます