use Carp ();
use Config;
-our $VERSION = '1.004008'; # 1.4.7
-my @KNOWN_FLAGS = (qw/--self-contained/);
+our $VERSION = '1.006001'; # 1.6.1
+
+our @KNOWN_FLAGS = qw(--self-contained);
sub import {
my ($class, @args) = @_;
- @args <= 1 + @KNOWN_FLAGS or die <<'DEATH';
-Please see `perldoc local::lib` for directions on using this module.
-DEATH
# Remember what PERL5LIB was when we started
my $perl5lib = $ENV{PERL5LIB} || '';
}
if($arg_store{'self-contained'}) {
- # The only directories that remain are those that we just defined and those
- # where core modules are stored. We put PERL5LIB first, so it'll be favored
- # over privlibexp and archlibexp
-
- @INC = _uniq(
- $class->install_base_perl_path($arg_store{path}),
- $class->install_base_arch_path($arg_store{path}),
- split( $Config{path_sep}, $perl5lib ),
- $Config::Config{privlibexp},
- $Config::Config{archlibexp}
- );
-
- # We explicitly set PERL5LIB here to the above de-duped list to prevent
- # @INC from growing with each invocation
- $ENV{PERL5LIB} = join( $Config{path_sep}, @INC );
+ die "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).\n";
}
$arg_store{path} = $class->resolve_path($arg_store{path});
MODULEBUILDRC => $class->modulebuildrc_path($path),
PERL_MM_OPT => "INSTALL_BASE=${path}",
PERL5LIB => join($Config{path_sep},
- $class->install_base_perl_path($path),
$class->install_base_arch_path($path),
- ($ENV{PERL5LIB} ?
+ $class->install_base_perl_path($path),
+ (($ENV{PERL5LIB}||()) ?
($interpolate == INTERPOLATE_ENV
? ($ENV{PERL5LIB})
: (($^O ne 'MSWin32') ? '$PERL5LIB' : '%PERL5LIB%' ))
PATH => join($Config{path_sep},
$class->install_base_bin_path($path),
($interpolate == INTERPOLATE_ENV
- ? $ENV{PATH}
+ ? ($ENV{PATH}||())
: (($^O ne 'MSWin32') ? '$PATH' : '%PATH%' ))
),
)
=end testing
+=encoding utf8
+
=head1 NAME
local::lib - create and use a local lib/ for perl modules with PERL5LIB
+L<Deutsche Übersetzung|podloc::de_DE::local::lib>
+
=head1 SYNOPSIS
In code -
From the shell -
- # Install LWP and it's missing dependencies to the 'my_lwp' directory
- perl -MCPAN -Mlocal::lib=my_lwp -e 'CPAN::install(LWP)'
-
- # Install LWP and *all non-core* dependencies to the 'my_lwp' directory
- perl -MCPAN -Mlocal::lib=--self-contained,my_lwp -e 'CPAN::install(LWP)'
+ # 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
A typical way to install local::lib is using what is known as the
"bootstrapping" technique. You would do this if your system administrator
hasn't already installed local::lib. In this case, you'll need to install
-local::lib in your home directory.
+local::lib in your home directory.
+
+If you do have administrative privileges, you will still want to set up your
+environment variables, as discussed in step 4. Without this, you would still
+install the modules into the system CPAN installation and also your Perl scripts
+will not use the lib/ path you bootstrapped with local::lib.
+
+Windows users must also see L</Differences when using this module under Win32>.
1. Download and unpack the local::lib tarball from CPAN (search for "Download"
on the CPAN page about local::lib). Do this as an ordinary user, not as root
If the system asks you whether it should automatically configure as much
as possible, you would typically answer yes.
-3. Run this:
+In order to install local::lib into a directory other than default, you need
+to give that directory on the call of bootstrap like this:
+
+ perl Makefile.PL --bootstrap=~/foo
+
+3. Run this: (local::lib assumes you have make installed on your system)
make test && make install
-4. Arrange for Perl to use your own packages instead of the system
-packages. If you are using bash, you can do this as follows:
+4. Now we need to setup the appropriate environment variables, so that Perl
+starts using our newly generated lib/ directory. If you are using bash or
+any other Bourne shells, you can add this to your shell startup script this
+way:
echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc
/bin/csh
perl -I$HOME/perl5/lib/perl5 -Mlocal::lib >> ~/.cshrc
-You can also pass --bootstrap=~/foo to get a different location -
-
- perl Makefile.PL --bootstrap=~/foo
- make test && make install
+If you passed to bootstrap a directory other than default, you also need to give that as
+import parameter to the call of the local::lib module like this way:
echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >>~/.bashrc
After writing your shell configuration file, be sure to re-read it to get the
-changed settings into your current shell's environment. Bourne shells use C<.
-~/.bashrc> for this, whereas C shells use C<source ~/.cshrc>. Replace .bashrc or
-.cshrc with the name of the file you wrote above with the echo command.
+changed settings into your current shell's environment. Bourne shells use
+C<. ~/.bashrc> for this, whereas C shells use C<source ~/.cshrc>.
If you're on a slower machine, or are operating under draconian disk space
limitations, you can disable the automatic generation of manpages from POD when
perl Makefile.PL --bootstrap --no-manpages
-If you want to install multiple Perl module environments, say for application evelopment,
-install local::lib globally and then:
+To avoid doing several bootstrap for several Perl module environments on the
+same account, for example if you use it for several different deployed
+applications independently, you can use one bootstrapped local::lib
+installation to install modules in different directories directly this way:
cd ~/mydir1
perl -Mlocal::lib=./
eval $(perl -Mlocal::lib=./) ### To set the environment for this shell alone
- printenv ### You will see that ~/mydir1 is in the PERL5LIB
+ printenv ### You will see that ~/mydir1 is in the PERL5LIB
perl -MCPAN -e install ... ### whatever modules you want
cd ../mydir2
... REPEAT ...
=head2 Differences when using this module under Win32
+To set up the proper environment variables for your current session of
+C<CMD.exe>, you can use this:
+
C:\>perl -Mlocal::lib
set MODULEBUILDRC=C:\DOCUME~1\ADMINI~1\perl5\.modulebuildrc
set PERL_MM_OPT=INSTALL_BASE=C:\DOCUME~1\ADMINI~1\perl5
set PERL5LIB=C:\DOCUME~1\ADMINI~1\perl5\lib\perl5;C:\DOCUME~1\ADMINI~1\perl5\lib\perl5\MSWin32-x86-multi-thread
set PATH=C:\DOCUME~1\ADMINI~1\perl5\bin;%PATH%
- ### To set the environment for this shell alone
+ ### To set the environment for this shell alone
C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\temp.bat
### instead of $(perl -Mlocal::lib=./)
If you want the environment entries to persist, you'll need to add then to the
-Control Panel's System applet yourself at the moment.
+Control Panel's System applet yourself or use L<App::local::lib::Win32Helper>.
The "~" is translated to the user's profile directory (the directory named for
the user under "Documents and Settings" (Windows XP or earlier) or "Users"
These values are then available for reference by any code after import.
+=head1 CREATING A SELF-CONTAINED SET OF MODULES
+
+See L<lib::core::only|lib::core::only> for one way to do this - but note that
+there are a number of caveats, and the best approach is always to perform a
+build against a clean perl (i.e. site and vendor as close to empty as possible).
+
=head1 METHODS
=head2 ensure_directory_structure_for
Patches to correctly output commands for csh style shells, as well as some
documentation additions, contributed by Christopher Nehren <apeiron@cpan.org>.
-'--self-contained' feature contributed by Mark Stosberg <mark@summersault.com>.
-
-Ability to pass '--self-contained' without a directory inspired by frew on
-irc.perl.org/#catalyst.
-
Doc patches for a custom local::lib directory contributed by Torsten Raudssus
<torsten@raudssus.de>.
Patch to add Win32 support contributed by Curtis Jewell <csjewell@cpan.org>.
+Warnings for missing PATH/PERL5LIB (as when not running interactively) silenced
+by a patch from Marco Emilio Poleggi.
+
+Mark Stosberg <mark@summersault.com> provided the code for the now deleted
+'--self-contained' option.
+
+Documentation patches to make win32 usage clearer by
+David Mertens <dcmertens.perl@gmail.com> (run4flat).
+
=head1 COPYRIGHT
Copyright (c) 2007 - 2009 the local::lib L</AUTHOR> and L</CONTRIBUTORS> as