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 )