Module-Provision

 view release on metacpan or  search on metacpan

share/perl_localenv  view on Meta::CPAN

#!/usr/bin/env perl
# If you have a $LOCAL_LIB directory then this script will set it up for
# you as it executes

# If used like /usr/bin/env then it will run other commands based on
# your current path settings (with a local::lib environment if present)

#  e.g. use FindBin qw( $Bin );
#       BEGIN { do catfile( $Bin, q(<appname>_localenv) ) or croak $EVAL_ERROR }

# The local::lib behavior can be explicitly enabled or disabled by setting
# the <APPNAME>_LOCAL_LIB enviromnent variable to true or false.

use lib;
use strict;
use warnings;

use Config;
use Cwd                   qw( abs_path );
use English               qw( -no_match_vars );
use File::Basename        qw( basename dirname );
use File::Spec::Functions qw( catdir catfile );

my $LOCAL_LIB  = 'local'; # This is the only configurable parameter

my $extend     = sub {
   my ($k, $v, $sep) = @_; $sep //= $Config::Config{path_sep};

   return $ENV{ $k } = $v.($ENV{ $k } ? $sep.$ENV{ $k } : q());
};
my $untaint    = sub {
   my $v = shift;

   $v = $v =~ m{ \A ([^\$%&\*;<>\`|]+) \z }mx ? $1 : die "Path ${v} tainted";

   return $v;
};
my $was_called = caller() ? 1 : 0;
my $our_path   = $was_called ? (caller())[ 1 ] : $PROGRAM_NAME;
my $bindir     = $untaint->( abs_path( dirname( $our_path ) ) );
my $basedir    = -f catfile( $bindir, 'Build.PL' )
              || -f catfile( $bindir, 'Makefile.PL' )
               ? $bindir : dirname( $bindir );
my $libdir     = catdir( $basedir, 'lib' );
my $local_lib  = catdir( $basedir, $LOCAL_LIB );
my $appname    = (split m{ [\-_] }mx, basename( $our_path, '.pl' ))[ 0 ];
my $active_key = (uc $appname).'_LOCAL_LIB';
my $active     = -d $local_lib;

exists $ENV{ $active_key } and defined $ENV{ $active_key }
   and $active = !! $ENV{ $active_key };

if ($active) {
   not -d $local_lib and warn "Path ${local_lib} not found from ${our_path}\n";
   # So we can find local::lib when fully self contained
   lib->import( catdir( $local_lib, 'lib', 'perl5' ) );

   require local::lib; local::lib->import( $local_lib );

   $extend->( 'PATH', catdir( $local_lib, 'bin' ) );
   $extend->( 'PERL5_MB_OPT', 'INSTALLMAN1DIR=none INSTALLMAN3DIR=none', q( ) );
}

$extend->( 'PATH', $bindir ); $extend->( 'PERL5LIB', $libdir );

lib->import( $libdir );

not $was_called and @ARGV and exec @ARGV;

1;

__END__

=pod

=encoding utf-8

=head1 Name

perl-localenv - Set environment to use a local library of Perl modules

=head1 Synopsis

   use English qw( -no_match_vars );
   use FindBin qw( $Bin );
   use File::Spec;

   BEGIN {
      my $bind = $Bin; $bind =~ m{ \A ([^\$%&\*;<>\`|]+) \z }mx and $bind = $1;
      my $path = File::Spec->catfile( $bind, 'coverage-localenv' );

      -f $path and (do $path or die $EVAL_ERROR || "Path ${path} not done\n");
   }

=head1 Description

Set environment to use a local library of Perl modules

=head1 Required Arguments

None

=head1 Options

None



( run in 0.943 second using v1.01-cache-2.11-cpan-71847e10f99 )