WorePAN
tokuhiromさんのOrePANをはじめ、似たようなものはすでにいくつかあるわけですが、テスト用のツールとしてはいまいち使いづらかったので屋上屋を重ねてみました。
使い方はこんな感じ。
use strict; use warnings; use Test::More; use WorePAN; my $worepan = WorePAN->new( root => './tmp/', files => [qw( I/IS/ISHIGAKI/Path-Extended-0.01.tar.gz )], cleanup => 1, use_backpan => 1, no_network => 0, ); # 何かCPANミラーが必要になるようなテストを実行 my $mirror_url = "file://".$worepan->root; ok !system("cpanm -f --mirror-only --mirror $mirror_url Path::Extended"); done_testing;
テストの際に最低限のファイルをダウンロード(またはローカルのCPANミラーからコピー)してきて使うのが前提なので、コマンドラインツールはいまのところついていません。また、必要としているファイルがCPANから削除されても困らないように、必要に応じてBackPANからもダウンロードできるようにしてあります(BackPANからは基本的に削除されることはありません)。おまけとして、Unixコマンドには特に依存していませんのでWindows環境でも問題なく動きますし、裏で使っているCPAN::ParseDistributionはMakefile.PLなどの解析をSafeコンパートメントの中で行うので、Makefile.PLの中でおかしなハックをしているようなディストリビューションに対しても多少安全です(もっとも、よほどのことがない限りそのような問題に行き当たることはないはずですが)。
あと、上ではCPAN上の(http://some.cpan.mirror/authors/id/に続く)パス名を明示的に指定していますが、MooseやCatalyst、DBICのようにリリースマネージャが複数人いるような大規模モジュールではどのバージョンが誰のところに入っているか覚えていられませんので、以下のようにディストリビューション名だけでもインストールできるようにしてあります(裏でディストリビューション名からファイルパスに変換するためのAPIを叩きに行っていますので、ネットワークが利用できる環境でしか動作しません。なお、テスト環境ではデフォルトでネットワークを利用しない設定になっていますので、テストでもこの機能を利用したい場合は明示的に「no_network => 0」を指定してください)。
my $worepan = WorePAN->new( dists => { 'Acme-CPANAuthors' => 0, 'Acme-CPANAuthors-Japanese' => 0.071226, }, no_network => 0, cleanup => 1, );
もちろん以下のようなスクリプトを使えばDarkPANやプロジェクト専用のCPANミラーを作成することもできます。
#!/usr/bin/env perl use strict; use warnings; use WorePAN; my $worepan = WorePAN->new( root => '/home/project/cpan', local_mirror => '/home/project/dists/', files => [qw{ MyProject-DBI-0.02.tar.gz M/MY/MYCOMPANY/MyProject-0.01.tar.gz }], );
filesにはCPAN上のパス名だけでなく、ローカルの任意のtarballやCPANミラーを指定できるので、上のスクリプトの場合、スクリプトと同じディレクトリにMyProject-DBI-0.02.tar.gzがあれば、/home/project/cpan/authors/id/L/LO/LOCAL/MyProject-DBI-0.02.tar.gzに、同じく/home/project/dists/authors/id/M/MY/MYCOMPANY/MyProject-0.01.tar.gzがあれば、/home/project/cpan/authors/id/M/MY/MYCOMPANY/MyProject-0.01.tar.gzにコピーされます。あとは上の例のようにcpanmの--mirror-onlyオプションと--mirrorオプションを適切に設定してインストールすればOKです。
さすがに名前がどうかと思うのでCPANにはまだアップしていません(アップする気になったら名前を変えると思います)。リポジトリはgithub上にあります。