Carmel
view release on metacpan or search on metacpan
lib/Carmel/Builder.pm view on Meta::CPAN
package Carmel::Builder;
use strict;
use warnings;
use Class::Tiny qw( snapshot cpanfile cpanfile_path repository_base collect_artifact );
use Path::Tiny;
use File::pushd;
sub tempdir {
my $self = shift;
$self->{tempdir} ||= $self->build_tempdir;
}
sub build_tempdir {
my %opts = ();
$opts{CLEANUP} = $ENV{PERL_FILE_TEMP_CLEANUP}
if exists $ENV{PERL_FILE_TEMP_CLEANUP};
Path::Tiny->tempdir(%opts);
}
sub install {
my($self, @args) = @_;
my @cmd;
if ($self->cpanfile) {
my $path = Path::Tiny->tempfile;
$self->cpanfile->save($path);
@cmd = ("--cpanfile", $path, "--installdeps", ".");
} else {
@cmd = @args;
}
if ($self->snapshot) {
my $path = Path::Tiny->tempfile;
$self->snapshot->write_index($path);
unshift @cmd,
"--mirror-index", $path,
"--cascade-search",
"--mirror", "http://cpan.metacpan.org";
}
local $ENV{PERL_CPANM_HOME} = $self->tempdir;
local $ENV{PERL_CPANM_OPT};
my $cpanfile = $self->cpanfile_path
or die "Can't locate 'cpanfile' to load module list.\n";
# one mirror for now
my $mirror = Module::CPANfile->load($cpanfile)->mirrors->[0];
# cleanup perl5 in case it was left from previous runs
my $lib = $self->repository_base->child('perl5');
$lib->remove_tree({ safe => 0 });
require Menlo::CLI::Compat;
my $cli = Menlo::CLI::Compat->new;
$cli->parse_options(
($Carmel::DEBUG ? () : "--quiet"),
($mirror ? ("-M", $mirror) : ()),
"--notest",
"--save-dists", $self->repository_base->child('cache'),
"-L", $lib,
"--no-static-install",
@cmd,
);
$cli->run;
for my $ent ($self->tempdir->child("latest-build")->children) {
next unless $ent->is_dir && $ent->child("blib/meta/install.json")->exists;
$self->collect_artifact->($ent);
}
$lib->remove_tree({ safe => 0 });
}
sub search_module {
my($self, $module, $version) = @_;
local $ENV{PERL_CPANM_HOME} = $self->tempdir;
local $ENV{PERL_CPANM_OPT};
my $cpanfile = $self->cpanfile_path
or die "Can't locate 'cpanfile' to load module list.\n";
# one mirror for now
my $mirror = Module::CPANfile->load($cpanfile)->mirrors->[0];
require Menlo::CLI::Compat;
require Carton::Dist;
my $cli = Menlo::CLI::Compat->new;
$cli->parse_options(
($Carmel::DEBUG ? () : "--quiet"),
($mirror ? ("-M", $mirror) : ()),
"--info",
"--save-dists", $self->repository_base->child('cache'),
( run in 2.031 seconds using v1.01-cache-2.11-cpan-5c0b1e786e0 )