App-plx
view release on metacpan or search on metacpan
bin/plx-packed view on Meta::CPAN
}
sub build_deact_all_environment_vars_for {
my $self = $_[0]->new->deactivate_all;
$self->build_environment_vars;
}
sub build_environment_vars {
my $self = shift;
(
PATH => join($_path_sep, _as_list($self->bins)),
PERL5LIB => join($_path_sep, _as_list($self->libs)),
PERL_LOCAL_LIB_ROOT => join($_path_sep, _as_list($self->roots)),
%{$self->extra},
);
}
sub setup_local_lib_for {
my $self = $_[0]->new->activate($_[1]);
$self->setup_local_lib;
}
sub setup_local_lib {
my $self = shift;
# if Carp is already loaded, ensure Carp::Heavy is also loaded, to avoid
# $VERSION mismatch errors (Carp::Heavy loads Carp, so we do not need to
# check in the other direction)
require Carp::Heavy if $INC{'Carp.pm'};
$self->setup_env_hash;
@INC = @{$self->inc};
}
sub setup_env_hash_for {
my $self = $_[0]->new->activate($_[1]);
$self->setup_env_hash;
}
sub setup_env_hash {
my $self = shift;
my %env = $self->build_environment_vars;
for my $key (keys %env) {
if (defined $env{$key}) {
$ENV{$key} = $env{$key};
}
else {
delete $ENV{$key};
}
}
}
sub print_environment_vars_for {
print $_[0]->environment_vars_string_for(@_[1..$#_]);
}
sub environment_vars_string_for {
my $self = $_[0]->new->activate($_[1], { always => 1});
$self->environment_vars_string;
}
sub environment_vars_string {
my ($self, $shelltype) = @_;
$shelltype ||= $self->guess_shelltype;
my $extra = $self->extra;
my @envs = (
PATH => $self->bins,
PERL5LIB => $self->libs,
PERL_LOCAL_LIB_ROOT => $self->roots,
map { $_ => $extra->{$_} } sort keys %$extra,
);
$self->_build_env_string($shelltype, \@envs);
}
sub _build_env_string {
my ($self, $shelltype, $envs) = @_;
my @envs = @$envs;
my $build_method = "build_${shelltype}_env_declaration";
my $out = '';
while (@envs) {
my ($name, $value) = (shift(@envs), shift(@envs));
if (
ref $value
&& @$value == 1
&& ref $value->[0]
&& ref $value->[0] eq 'SCALAR'
&& ${$value->[0]} eq $name) {
next;
}
$out .= $self->$build_method($name, $value);
}
my $wrap_method = "wrap_${shelltype}_output";
if ($self->can($wrap_method)) {
return $self->$wrap_method($out);
}
return $out;
}
sub build_bourne_env_declaration {
my ($class, $name, $args) = @_;
my $value = $class->_interpolate($args, '${%s:-}', qr/["\\\$!`]/, '\\%s');
if (!defined $value) {
return qq{unset $name;\n};
}
$value =~ s/(^|\G|$_path_sep)\$\{$name:-\}$_path_sep/$1\${$name}\${$name:+$_path_sep}/g;
$value =~ s/$_path_sep\$\{$name:-\}$/\${$name:+$_path_sep\${$name}}/;
qq{${name}="$value"; export ${name};\n}
}
sub build_csh_env_declaration {
my ($class, $name, $args) = @_;
my ($value, @vars) = $class->_interpolate($args, '${%s}', qr/["\$]/, '"\\%s"');
if (!defined $value) {
return qq{unsetenv $name;\n};
}
my $out = '';
for my $var (@vars) {
bin/plx-packed view on Meta::CPAN
sub resolve_home_path {
my ($class, $path) = @_;
$path =~ /^~([^\/]*)/ or return $path;
my $user = $1;
my $homedir = do {
if (! length($user) && defined $ENV{HOME}) {
$ENV{HOME};
}
else {
require File::Glob;
File::Glob::bsd_glob("~$user", File::Glob::GLOB_TILDE());
}
};
unless (defined $homedir) {
require Carp; require Carp::Heavy;
Carp::croak(
"Couldn't resolve homedir for "
.(defined $user ? $user : 'current user')
);
}
$path =~ s/^~[^\/]*/$homedir/;
$path;
}
sub resolve_relative_path {
my ($class, $path) = @_;
_rel2abs($path);
}
sub ensure_dir_structure_for {
my ($class, $path, $opts) = @_;
$opts ||= {};
my @dirs;
foreach my $dir (
$class->lib_paths_for($path),
$class->install_base_bin_path($path),
) {
my $d = $dir;
while (!-d $d) {
push @dirs, $d;
require File::Basename;
$d = File::Basename::dirname($d);
}
}
warn "Attempting to create directory ${path}\n"
if !$opts->{quiet} && @dirs;
my %seen;
foreach my $dir (reverse @dirs) {
next
if $seen{$dir}++;
mkdir $dir
or -d $dir
or die "Unable to create $dir: $!"
}
return;
}
sub guess_shelltype {
my $shellbin
= defined $ENV{SHELL} && length $ENV{SHELL}
? ($ENV{SHELL} =~ /([\w.]+)$/)[-1]
: ( $^O eq 'MSWin32' && exists $ENV{'!EXITCODE'} )
? 'bash'
: ( $^O eq 'MSWin32' && $ENV{PROMPT} && $ENV{COMSPEC} )
? ($ENV{COMSPEC} =~ /([\w.]+)$/)[-1]
: ( $^O eq 'MSWin32' && !$ENV{PROMPT} )
? 'powershell.exe'
: 'sh';
for ($shellbin) {
return
/csh$/ ? 'csh'
: /fish$/ ? 'fish'
: /command(?:\.com)?$/i ? 'cmd'
: /cmd(?:\.exe)?$/i ? 'cmd'
: /4nt(?:\.exe)?$/i ? 'cmd'
: /powershell(?:\.exe)?$/i ? 'powershell'
: 'bourne';
}
}
1;
__END__
=encoding utf8
=head1 NAME
local::lib - create and use a local lib/ for perl modules with PERL5LIB
=head1 SYNOPSIS
In code -
use local::lib; # sets up a local lib at ~/perl5
use local::lib '~/foo'; # same, but ~/foo
# Or...
use FindBin;
use local::lib "$FindBin::Bin/../support"; # app-local support library
From the shell -
# Install LWP and its missing dependencies to the '~/perl5' directory
perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)'
# Just print out useful shell commands
$ perl -Mlocal::lib
PERL_MB_OPT='--install_base /home/username/perl5'; export PERL_MB_OPT;
PERL_MM_OPT='INSTALL_BASE=/home/username/perl5'; export PERL_MM_OPT;
PERL5LIB="/home/username/perl5/lib/perl5"; export PERL5LIB;
PATH="/home/username/perl5/bin:$PATH"; export PATH;
PERL_LOCAL_LIB_ROOT="/home/usename/perl5:$PERL_LOCAL_LIB_ROOT"; export PERL_LOCAL_LIB_ROOT;
From a F<.bash_profile> or F<.bashrc> file -
eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"
bin/plx-packed view on Meta::CPAN
|
$VARNAME_REGEXP # without parens
)
\s*
=[^=~>] # = but not ==, nor =~, nor =>
}x;sub new_from_file {my$class=shift;my$filename=File::Spec->rel2abs(shift);return undef unless defined($filename)&& -f $filename;return$class->_init(undef,$filename,@_)}sub new_from_handle {my$class=shift;my$handle=shift;my$filename=shift;return...
#; package Module::Metadata::_version::p${pn};
use version;
sub {
local $sigil$variable_name;
$line;
\$$variable_name
};
};$eval=$1 if$eval =~ m{^(.+)}s;local $^W;my$vsub=__clean_eval($eval);if ($@ =~ /Can't locate/ && -d 'lib'){local@INC=('lib',@INC);$vsub=__clean_eval($eval)}warn "Error evaling version line '$eval' in $self->{filename}: $@\n" if $@;(ref($vsub)e...
MODULE_METADATA
$fatpacked{"Parse/CPAN/Meta.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARSE_CPAN_META';
use 5.008001;use strict;package Parse::CPAN::Meta;our$VERSION='1.4414';use Exporter;use Carp 'croak';our@ISA=qw/Exporter/;our@EXPORT_OK=qw/Load LoadFile/;sub load_file {my ($class,$filename)=@_;my$meta=_slurp($filename);if ($filename =~ /\.ya?ml$...
PARSE_CPAN_META
$fatpacked{"Parse/PMFile.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARSE_PMFILE';
package Parse::PMFile;sub __clean_eval {eval $_[0]}use strict;use warnings;use Safe;use JSON::PP ();use Dumpvalue;use version ();use File::Spec ();our$VERSION='0.36';our$VERBOSE=0;our$ALLOW_DEV_VERSION=0;our$FORK=0;our$UNSAFE=$] < 5.010000 ? 1 : ...
read the file. It issued the following error: C< $err->{r} >},);$errors{$package}={open=>$err->{r},infile=>$pp->{infile},}}else {$pp->{version}="undef";$self->_verbose(1,qq{Parse::PMFile was not able to
parse the following line in that file: C< $err->{line} >
Note: the indexer is running in a Safe compartement and cannot
provide the full functionality of perl in the VERSION line. It
is trying hard, but sometime it fails. As a workaround, please
consider writing a META.yml that contains a 'provides'
attribute or contact the CPAN admins to investigate (yet
another) workaround against "Safe" limitations.)},);$errors{$package}={parse_version=>$err->{line},infile=>$err->{file},}}}for ($package,$pp->{version},){if (!defined || /^\s*$/ || /\s/){delete$ppp->{$package};next}}$checked_in{$package}=...
local(\$^W) = 0;
Parse::PMFile::_parse_version_safely("$pmcp");
};$comp->permit("entereval");$comp->share("*Parse::PMFile::_parse_version_safely");$comp->share("*version::new");$comp->share("*version::numify");$comp->share_from('main',['*version::','*charstar::','*Exporter::','*DynaLoader::']);$co...
# (.*) # takes too much time if $pline is long
(?<![*\$\\@%&]) # no sigils
\bpackage\s+
([\w\:\']+)
\s*
(?: $ | [\}\;] | \{ | \s+($version::STRICT) )
}x){$pkg=$1;$strict_version=$2;if ($pkg eq "DB"){next PLINE}}if ($pkg){$pkg =~ s/\'/::/;next PLINE unless$pkg =~ /^[A-Za-z]/;next PLINE unless$pkg =~ /\w$/;next PLINE if$pkg eq "main";next PLINE if length($pkg)> 128;$ppp->{$pk...
package #
ExtUtils::MakeMaker::_version;
local $1$2;
\$$2=undef; do {
$_
}; \$$2
};local $^W=0;local$SIG{__WARN__}=sub {};$result=__clean_eval($eval);if ($@ or!defined$result){die +{eval=>$eval,line=>$current_parsed_line,file=>$parsefile,err=>$@,}}last}close FH;$result="undef" unless defined$result;if ((ref$result...
PARSE_PMFILE
$fatpacked{"String/ShellQuote.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'STRING_SHELLQUOTE';
package String::ShellQuote;use strict;use vars qw($VERSION @ISA @EXPORT);require Exporter;$VERSION='1.04';@ISA=qw(Exporter);@EXPORT=qw(shell_quote shell_quote_best_effort shell_comment_quote);sub croak {require Carp;goto&Carp::croak}sub _shell_qu...
STRING_SHELLQUOTE
$fatpacked{"lib/core/only.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LIB_CORE_ONLY';
package lib::core::only;use strict;use warnings FATAL=>'all';use Config;sub import {@INC=@Config{qw(privlibexp archlibexp)};return}1;
LIB_CORE_ONLY
$fatpacked{"local/lib.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCAL_LIB';
package local::lib;use 5.006;use strict;use warnings;use Config;our$VERSION='2.000015';$VERSION=eval$VERSION;BEGIN {*_WIN32=($^O eq 'MSWin32' || $^O eq 'NetWare' || $^O eq 'symbian')? sub(){1}: sub(){0};*_USE_FSPEC=($^O eq 'MacOS' || $^O eq 'VMS'...
WHOA THERE! It looks like you've got some fancy dashes in your commandline!
These are *not* the traditional -- dashes that software recognizes. You
probably got these by copy-pasting from the perldoc for this module as
rendered by a UTF8-capable formatter. This most typically happens on an OS X
terminal, but can happen elsewhere too. Please try again after replacing the
dashes with normal minus signs.
DEATH
FATAL: The local::lib --self-contained flag has never worked reliably and the
original author, Mark Stosberg, was unable or unwilling to maintain it. As
such, this flag has been removed from the local::lib codebase in order to
prevent misunderstandings and potentially broken builds. The local::lib authors
recommend that you look at the lib::core::only module shipped with this
distribution in order to create a more robust environment that is equivalent to
what --self-contained provided (although quite possibly not what you originally
thought it provided due to the poor quality of the documentation, for which we
apologise).
DEATH
LOCAL_LIB
$fatpacked{"parent.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARENT';
package parent;use strict;use vars qw($VERSION);$VERSION='0.228';sub import {my$class=shift;my$inheritor=caller(0);if (@_ and $_[0]eq '-norequire'){shift @_}else {for (my@filename=@_){if ($_ eq $inheritor){warn "Class '$inheritor' tried to inheri...
PARENT
$fatpacked{"version.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSION';
package version;use 5.006002;use strict;use warnings::register;if ($] >= 5.015){warnings::register_categories(qw/version/)}use vars qw(@ISA $VERSION $CLASS $STRICT $LAX *declare *qv);$VERSION=0.9912;$CLASS='version';{local$SIG{'__DIE__'};if (1){e...
VERSION
$fatpacked{"version/regex.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSION_REGEX';
package version::regex;use strict;use vars qw($VERSION $CLASS $STRICT $LAX);$VERSION=0.9912;my$FRACTION_PART=qr/\.[0-9]+/;my$STRICT_INTEGER_PART=qr/0|[1-9][0-9]*/;my$LAX_INTEGER_PART=qr/[0-9]+/;my$STRICT_DOTTED_DECIMAL_PART=qr/\.[0-9]{1,3}/;my$LA...
|
$FRACTION_PART $LAX_ALPHA_PART?
/x;my$LAX_DOTTED_DECIMAL_VERSION=qr/
v $LAX_INTEGER_PART (?: $LAX_DOTTED_DECIMAL_PART+ $LAX_ALPHA_PART? )?
|
$LAX_INTEGER_PART? $LAX_DOTTED_DECIMAL_PART{2,} $LAX_ALPHA_PART?
/x;$LAX=qr/ undef | $LAX_DECIMAL_VERSION | $LAX_DOTTED_DECIMAL_VERSION /x;sub is_strict {defined $_[0]&& $_[0]=~ qr/ \A $STRICT \z /x}sub is_lax {defined $_[0]&& $_[0]=~ qr/ \A $LAX \z /x}1;
VERSION_REGEX
$fatpacked{"version/vpp.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSION_VPP';
package charstar;use overload ('""'=>\&thischar,'0+'=>\&thischar,'++'=>\&increment,'--'=>\&decrement,'+'=>\&plus,'-'=>\&minus,'*'=>\&multiply,'cmp'=>\&cmp,'<=>'=>\&spaceship,'bool'=>\&thischar,'='=>\&clone,);sub new {my ($self,$string)=@_;my$clas...
VERSION_VPP
s/^ //mg for values %fatpacked;
my $class = 'FatPacked::'.(0+\%fatpacked);
no strict 'refs';
*{"${class}::files"} = sub { keys %{$_[0]} };
if ($] < 5.008) {
*{"${class}::INC"} = sub {
if (my $fat = $_[0]{$_[1]}) {
my $pos = 0;
my $last = length $fat;
return (sub {
return 0 if $pos == $last;
my $next = (1 + index $fat, "\n", $pos) || $last;
$_ .= substr $fat, $pos, $next - $pos;
$pos = $next;
return 1;
});
bin/plx-packed view on Meta::CPAN
sub show_config_libspec {
my @ent = @{$self->layout_libspec_config};
my $max = List::Util::max(map length($_->[0]), @ent);
say sprintf("%-${max}s %s", @$_) for @ent;
}
sub run_named_config_add {
my ($self, $type, $name, $value) = @_;
barf "plx --config ${type} add <name> <value>"
unless $name and defined($value);
unless (-d (my $dir = $self->layout_config_dir($type))) {
mkdir($dir) or die "Couldn't make config dir ${dir}: $!";
}
$self->write_config_entry([ $type => $name ], $value);
}
sub run_named_config_del {
my ($self, $type, $name) = @_;
barf "plx --config ${type} dev <name>" unless $name;
$self->clear_config_entry([ $type => $name ]);
}
sub run_config_libspec_add { shift->run_named_config_add(libspec => @_) }
sub run_config_libspec_del { shift->run_named_config_del(libspec => @_) }
sub show_config_env {
my $max = List::Util::max(
map length, my @names = $self->list_config_names('env')
);
say sprintf("%-${max}s %s", $_, $self->read_config_entry([ env => $_ ]))
for @names;
}
sub run_config_env_add { shift->run_named_config_add(env => @_) }
sub run_config_env_del { shift->run_named_config_del(env => @_) }
sub show_env {
my ($self, $env) = @_;
$self->ensure_layout_config_dir;
local $ENV{$env} = '';
$self->setup_env;
say $_ for split ':', $ENV{$env};
}
sub run_action_libs { $self->show_env('PERL5LIB') }
sub run_action_paths { $self->show_env('PATH') }
sub run_action_env {
$self->ensure_layout_config_dir;
$self->setup_env;
my @env_change;
our %orig_env;
foreach my $key (sort(keys %{{ %orig_env, %ENV }})) {
my ($oval, $eval) = ($orig_env{$key}, $ENV{$key});
if (!defined($eval) or ($oval//'') ne $eval) {
push @env_change, [ $key, $eval ];
}
}
my $shelltype = local::lib->guess_shelltype;
my $shellbuild = "build_${shelltype}_env_declaration";
foreach my $change (@env_change) {
print +local::lib->$shellbuild(@$change);
}
}
sub run_action_help {
require Pod::Usage;
Pod::Usage::pod2usage();
}
sub run_action_version {
say sprintf "%f", $VERSION;
}
sub run_action_base {
my ($self, $base, @chain) = @_;
unless ($base) {
say $self->layout_base_dir;
return;
}
barf "--base <base> <action> <args>" unless @chain;
$self->new({ layout_base_dir => $base })->run(@chain);
}
sub _parse_multi {
my ($self, @args) = @_;
my @multi;
MULTI: while (@args) {
barf "Expected multi arg [, got: $args[0]" unless $args[0] eq '[';
shift @args;
my @action;
while (my $el = shift @args) {
push @multi, \@action and next MULTI if $el eq ']';
push @action, $el;
}
barf "Missing closing ] for multi";
}
return @multi;
}
sub run_action_multi {
my ($self, @args) = @_;
return $self->run_multi(@args) if @args and ref($args[0]);
my @multi = $self->_parse_multi(@args);
$self->run_multi(@multi);
}
sub run_multi {
my ($self, @multi) = @_;
foreach my $multi (@multi) {
my @debug_multi = map +(ref($_) ? ('[', @$_, ']') : $_), @$multi;
stderr '# '.join(' ', plx => @debug_multi);
$self->run(@$multi);
}
}
sub run_action_showmulti {
my ($self, @args) = @_;
my @multi = $self->_parse_multi(@args);
( run in 2.569 seconds using v1.01-cache-2.11-cpan-f56aa216473 )