minicpanを工夫してみた

外出時にcpanモジュール入れるのにminicpanを使っていますが、いちいちminicpanを起動して、オプション指定して、使い終わったら落とすという流れがめんどくさかったので、一連の流れをコマンドにしてみた。

(minicpan用のhttpdを常時起動しておいて、PERL_CPANM_OPTを指定しておけばいいだけですけど)

minicpanの保存先を予め決めておいて

minicpan -l ~/perl5/minicpan -r http://mirror/

こんな感じでcpanm_minicpanとして作成した。

#!/usr/bin/env perl
use strict;
use warnings;
use Plack::Builder;
use Plack::Middleware::Static;
use Plack::Runner;
use Test::TCP;

my $server = Test::TCP->new (
    code => sub {
        my $port = shift;
        my $app = builder {
            enable "Plack::Middleware::Static",
            path => qr{^/},
            root => $ENV{HOME} . '/perl5/minicpan';
        };
        my @args = ("--port=$port");
        unless ( $ENV{DEBUG} ) {
            push @args, '--access-log=/dev/null';
            open STDERR, '>', '/dev/null' or die $!;
            open STDOUT, '>', '/dev/null' or die $!;
        }
        my $runner = Plack::Runner->new;
        $runner->parse_options(@args);
        $runner->run($app);
    },
);

printf STDERR "Start minicpan server: 0.0.0.0:%s (pid: %d)\n\n", $server->port, $server->pid;
my $port = $server->port;
system 'cpanm', '--mirror-only', "--mirror=http://localhost:$port/", @ARGV;

printf STDERR "\nStopping minicpan server: 0.0.0.0:%s (pid: %d)", $server->port, $server->pid;
undef $server;

zsh functionの_cpanmの補完対象に追加しておけば、補完も効く。