App-p5stack
view release on metacpan or search on metacpan
lib/App/p5stack.pm view on Meta::CPAN
package App::p5stack;
# ABSTRACT: manage your dependencies and perl requirements locally
use strict;
use warnings;
use Cwd;
use File::Which;
use File::Basename;
use File::Spec::Functions;
use File::Path qw/make_path/;
use Path::Tiny;
use Archive::Tar;
use Data::Dumper;
use YAML;
sub new {
my ($class, @argv) = @_;
my $self = bless {}, $class;
$self->{orig_argv} = [@argv];
$self->{command} = @argv ? lc shift @argv : '';
$self->{argv} = [@argv];
# handle config
$self->_do_config;
return $self;
}
sub run {
my ($self) = @_;
if ($self->{command} eq 'setup') { $self->_do_setup; }
elsif ($self->{command} eq 'perl') { $self->_do_perl; }
elsif ($self->{command} eq 'cpanm') { $self->_do_cpanm; }
elsif ($self->{command} eq 'bin') { $self->_do_bin; }
elsif ($self->{command} eq 'run') { $self->_do_run; }
else { $self->_do_help; }
}
sub _do_config {
my ($self) = @_;
# set some defaults
$self->{perl} = 'system';
$self->{deps} = 'dzil';
$self->{skip_install} = 1;
$self->{p5stack_root} = catfile($ENV{HOME},'.p5stack');
$self->{perls_root} = catfile($ENV{HOME},'.p5stack','perls');
$self->{perl_version} = '5.20.3';
# guess stuff from context
$self->{deps} = 'cpanfile' if -e 'cpanfile';
# read config from file if available
my $file;
-e 'p5stack.yml' and $file = 'p5stack.yml';
-e "$ENV{HOME}.p5stack/p5stack.yml" and $file = "$ENV{HOME}.p5stack/p5stack.yml"; # FIXME
$ENV{P5STACKCFG} and $file = $ENV{P5STACKCFG};
my $config;
if ($file) {
my $yaml = path($file)->slurp_utf8;
$config = Load $yaml;
}
# FIXME re-factor after logic is more stable
if ( file_name_is_absolute($config->{perl}) ) {
$self->{perl_version} = _get_perl_version($config->{perl});
$self->{perl} = $config->{perl};
}
if ( $self->{perl} eq 'system' ) {
$self->{perl} = which 'perl';
$self->{perl_version} = _get_perl_version($self->{perl});
}
if ( exists($config->{perl}) and $config->{perl} =~ m/^[\d\.]+$/ ) {
$self->{perl_version} = $config->{perl};
my $perl = catfile($self->{perls_root},$config->{perl},'bin','perl');
$self->{perl} = $perl;
$self->{skip_install} = 0 unless -e $perl;
}
for (qw/deps/) {
$self->{$_} = $config->{$_} if exists $config->{$_};
}
# set more stuff
$self->{home} = getcwd;
$self->{local_lib} = catfile($self->{home},'.local',$self->{perl_version});
$self->{local_bin} = catfile($self->{home},'.local',$self->{perl_version},'bin');
$self->{Ilib} = catfile($self->{home},'.local',$self->{perl_version},'lib','perl5');
$self->{log_file} = catfile($self->{p5stack_root},'p5stack-setup.log');
}
sub _do_setup {
my ($self) = @_;
make_path($self->{p5stack_root}) unless -e $self->{p5stack_root};
_log('Hammering setup ...');
_log("Tail ".catfile('$HOME','.p5stack','p5stack-setup.log')." to follow the process ...");
$self->_do_install_perl_release;
system "curl -s -L https://cpanmin.us | $self->{perl} - -l $self->{local_lib} --reinstall --no-sudo App::cpanminus local::lib > $self->{log_file} 2>&1";
$self->{cpanm_flag} = $? >> 8;
_log("Getting dependencies info using '$self->{deps}' ...");
_log('Installing dependencies ...');
my $cpanm = $self->_get_cpanm;
if ($self->{deps} eq 'dzil') {
( run in 1.626 second using v1.01-cache-2.11-cpan-39bf76dae61 )