X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit%2Flocal-lib.git;a=blobdiff_plain;f=lib%2Flocal%2Flib.pm;h=216426be0e9014cb38f4b3a76333430bdbc6535e;hp=c9f9f485ea8e52a17657c32a07717996b563a385;hb=1730f48f02f596ea214aab12466dd6471a2990d7;hpb=49c9e33470b288061568ca818c418d6adaa382e7 diff --git a/lib/local/lib.pm b/lib/local/lib.pm index c9f9f48..216426b 100644 --- a/lib/local/lib.pm +++ b/lib/local/lib.pm @@ -8,11 +8,13 @@ use 5.006; use File::Spec (); use Config; -our $VERSION = '1.008026'; # 1.8.26 +our $VERSION = '2.000004'; # 2.0.4 $VERSION = eval $VERSION; sub import { my ($class, @args) = @_; + push @args, @ARGV + if $0 eq '-'; my @steps; my %opts; @@ -380,7 +382,7 @@ sub build_bourne_env_declaration { $value =~ s/(^|\G|$_path_sep)\$$name$_path_sep/$1\$$name\${$name+$_path_sep}/g; $value =~ s/$_path_sep\$$name$/\${$name+$_path_sep}\$$name/; - qq{export ${name}="$value";\n} + qq{${name}="$value";\nexport ${name};\n} } sub build_csh_env_declaration { @@ -426,7 +428,7 @@ sub build_powershell_env_declaration { my $value = $class->_interpolate($args, '$env:%s', '"', '`%s'); if (!$value) { - return qq{Remove-Item Env:\\$name;\n}; + return qq{Remove-Item -ErrorAction 0 Env:\\$name;\n}; } my $maybe_path_sep = qq{\$(if("\$env:$name"-eq""){""}else{"$_path_sep"})}; @@ -440,6 +442,16 @@ sub wrap_powershell_output { return $out || " \n"; } +sub build_fish_env_declaration { + my ($class, $name, $args) = @_; + my $value = $class->_interpolate($args, '$%s', '"', '\\%s'); + if (!defined $value) { + return qq{set -e $name;\n}; + } + $value =~ s/$_path_sep/ /g; + qq{set -x $name $value;\n}; +} + sub _interpolate { my ($class, $args, $var_pat, $escape, $escape_pat) = @_; return @@ -475,20 +487,6 @@ sub pipeline { } } -=begin testing - -#:: test pipeline - -package local::lib; - -{ package Foo; sub foo { -$_[1] } sub bar { $_[1]+2 } sub baz { $_[1]+3 } } -my $foo = bless({}, 'Foo'); -Test::More::ok($foo->${pipeline qw(foo bar baz)}(10) == -15); - -=end testing - -=cut - sub resolve_path { my ($class, $path) = @_; @@ -510,25 +508,6 @@ sub resolve_empty_path { } } -=begin testing - -#:: test classmethod setup - -my $c = 'local::lib'; - -=end testing - -=begin testing - -#:: test classmethod - -is($c->resolve_empty_path, '~/perl5'); -is($c->resolve_empty_path('foo'), 'foo'); - -=end testing - -=cut - sub resolve_home_path { my ($class, $path) = @_; return $path unless ($path =~ /^~/); @@ -558,17 +537,6 @@ sub resolve_relative_path { $path = File::Spec->rel2abs($path); } -=begin testing - -#:: test classmethod - -local *File::Spec::rel2abs = sub { shift; 'FOO'.shift; }; -is($c->resolve_relative_path('bar'),'FOObar'); - -=end testing - -=cut - sub ensure_dir_structure_for { my ($class, $path) = @_; unless (-d $path) { @@ -584,20 +552,6 @@ sub ensure_dir_structure_for { return; } -=begin testing - -#:: test classmethod - -File::Path::rmtree('t/var/splat'); - -$c->ensure_dir_structure_for('t/var/splat'); - -ok(-d 't/var/splat'); - -=end testing - -=cut - sub guess_shelltype { my $shellbin = defined $ENV{SHELL} @@ -612,12 +566,13 @@ sub guess_shelltype { for ($shellbin) { return - /csh/ ? 'csh' - : /command\.com/i ? 'cmd' - : /cmd\.exe/i ? 'cmd' - : /4nt\.exe/i ? 'cmd' - : /powershell\.exe/i ? 'powershell' - : 'bourne'; + /csh$/ ? 'csh' + : /fish/ ? 'fish' + : /command(?:\.com)?$/i ? 'cmd' + : /cmd(?:\.exe)?$/i ? 'cmd' + : /4nt(?:\.exe)?$/i ? 'cmd' + : /powershell(?:\.exe)?$/i ? 'powershell' + : 'bourne'; } } @@ -654,6 +609,10 @@ From the shell - export PERL5LIB="/home/username/perl5/lib/perl5" export PATH="/home/username/perl5/bin:$PATH" +From a .bashrc file - + + [ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)" + =head2 The bootstrapping technique A typical way to install local::lib is using what is known as the @@ -670,12 +629,18 @@ By default local::lib installs itself and the CPAN modules into ~/perl5. Windows users must also see L. -1. Download and unpack the local::lib tarball from CPAN (search for "Download" +=over 4 + +=item 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 or administrator. Unpack the file in your home directory or in any other convenient location. -2. Run this: +=item 2. + +Run this: perl Makefile.PL --bootstrap @@ -687,16 +652,20 @@ to specify the name of the directory when you call bootstrap, as follows: perl Makefile.PL --bootstrap=~/foo -3. Run this: (local::lib assumes you have make installed on your system) +=item 3. + +Run this: (local::lib assumes you have make installed on your system) make test && make install -4. Now we need to setup the appropriate environment variables, so that Perl +=item 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 + echo '[ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"' >>~/.bashrc If you are using C shell, you can do this as follows: @@ -709,12 +678,14 @@ 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 + echo '[ $SHLVL -eq 1 ] && 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. +=back + 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 installing modules by using the C<--no-manpages> argument when bootstrapping: @@ -734,6 +705,12 @@ installation to install modules in different directories directly this way: cd ../mydir2 ... REPEAT ... +When used in a C<.bashrc> file, it is recommended that you protect against +re-activating a directory in a sub-shell. This can be done by checking the +C<$SHLVL> variable as shown in synopsis. Without this, sub-shells created by +the user or other programs will override changes made to the parent shell's +environment. + If you are working with several C environments, you may want to remove some of them from the current environment without disturbing the others. You can deactivate one environment like this (using bourne sh): @@ -792,7 +769,7 @@ and the subdirectories are created. =head3 PowerShell -local::lib also supports PowerShell, and an be used with the +local::lib also supports PowerShell, and can be used with the C cmdlet. Invoke-Expression "$(perl -Mlocal::lib)" @@ -1232,6 +1209,24 @@ not set, a Bourne-compatible shell is assumed. =item * Should probably auto-fixup CPAN config if not already done. +=item * local::lib loads L. When used to set shell variables, +this isn't a problem. When used inside a perl script, any L +version inside the local::lib will be ignored. A workaround for this is using +C inside the script instead of using +C directly. + +=item * Conflicts with L's C option. +C uses the C option, as it has more predictable and +sane behavior. If something attempts to use the C option when running +a F, L will refuse to run, as the two +options conflict. This can be worked around by temporarily unsetting the +C environment variable. + +=item * Conflicts with L's C<--prefix> option. Similar to the +previous limitation, but any C<--prefix> option specified will be ignored. +This can be worked around by temporarily unsetting the C +environment variable. + =back Patches very much welcome for any of the above. @@ -1332,9 +1327,12 @@ environment later on contributed by Andrew Rodland . Patch for Carp version mismatch contributed by Hakim Cassimally . +Rewrite of internals and numerous bug fixes and added features contributed by +Graham Knop . + =head1 COPYRIGHT -Copyright (c) 2007 - 2010 the local::lib L and L as +Copyright (c) 2007 - 2013 the local::lib L and L as listed above. =head1 LICENSE