my @active_lls = $self->active_paths;
- if (grep { $_ eq $path } @active_lls) {
+ if (grep { $_ eq $path } @active_lls[1 .. $#active_lls]) {
$self = $self->deactivate($path);
}
- my %args = (
- bins => [ $self->install_base_bin_path($path), @{$self->bins} ],
- libs => [ $self->install_base_perl_path($path), @{$self->libs} ],
- inc => [ $self->lib_paths_for($path), @{$self->inc} ],
- roots => [ $path, @{$self->roots} ],
- );
+ my %args;
+ if (!@active_lls || $active_lls[0] ne $path) {
+ %args = (
+ bins => [ $self->install_base_bin_path($path), @{$self->bins} ],
+ libs => [ $self->install_base_perl_path($path), @{$self->libs} ],
+ inc => [ $self->lib_paths_for($path), @{$self->inc} ],
+ roots => [ $path, @{$self->roots} ],
+ );
+ }
$args{extra} = $self->installer_options_for($path);
&& ${$value->[0]} eq $name) {
next;
}
- if (!ref $value
- && defined $value ? $value eq $ENV{$name} : !defined $ENV{$name}
+ if (
+ !ref $value
+ and defined $value
+ ? (defined $ENV{$name} && $value eq $ENV{$name})
+ : !defined $ENV{$name}
) {
next;
}
$out .= $self->$build_method($name, $value);
}
+ my $wrap_method = 'wrap_' . $self->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);
+ my $joined;
+ for (@$value) {
+ if (!defined $joined) {
+ $joined = $_;
+ }
+ elsif ($_ eq "\$$name") {
+ $joined .= "\${$name+$Config{path_sep}}$_";
+ }
+ else {
+ $joined .= "$Config{path_sep}$_";
+ }
+ }
defined $value
- ? qq{export ${name}="${value}";\n}
+ ? qq{export ${name}="$joined";\n}
: qq{unset ${name};\n};
}
sub build_csh_env_declaration {
my ($class, $name, $args) = @_;
my ($value, @vars) = $class->_interpolate($args, undef, undef, '"', qq{"\\"});
- (join '', map qq{if ! \$?$_ setenv $_ "";\n}, @vars)
- . defined $value
- ? qq{setenv $name "$value";\n}
- : qq{unsetenv $name;\n};
+
+ my $out = '';
+ if (@vars) {
+ $out = qq{if \$?$name };
+ }
+ $out .= defined $value ? qq{setenv $name "}.join($Config{path_sep},@$value).qq{";\n} : qq{unsetenv $name;\n};
+ if (@vars) {
+ my $no_var = $class->_interpolate([ grep { !ref } @$args ], undef, undef, '"', qq{"\\"});
+ if (defined $no_var) {
+ $out .= qq{if ! \$?$name setenv $name "}.join($Config{path_sep},@$no_var).qq{";\n};
+ }
+ }
+ $out;
}
sub build_cmd_env_declaration {
my ($class, $name, $args) = @_;
my $value = $class->_interpolate($args, '%', '%', qr([()!^"<>&|]), '^');
defined $value
- ? qq{set $name=$value\n}
- : qq{set $name=\n};
+ ? qq{\@set $name=}.join($Config{path_sep},@$value).qq{\n}
+ : qq{\@set $name=\n};
}
sub build_powershell_env_declaration {
my ($class, $name, $args) = @_;
my $value = $class->_interpolate($args, '$env:', '', '"', '`');
defined $value
- ? qq{\$env:$name = "$value"\n}
- : "Remove-Item Env:\\$name\n";
+ ? qq{\$env:$name = "}.join($Config{path_sep},@$value).qq{";\n}
+ : "Remove-Item Env:\\$name;\n";
+}
+sub wrap_powershell_output {
+ my ($class, $out) = @_;
+ return $out || " \n";
}
my ($class, $args, $start, $end, $escape, $escape_char) = @_;
return
unless defined $args;
- return $args
+ $args = [ $args ]
unless ref $args;
return
unless @$args;
$escape = '"' unless defined $escape;
$escape_char = "\\" unless defined $escape_char;
my @vars;
- my $string = join($Config{path_sep}, map {
+ my $string = [ map {
if (ref $_ && ref $_ eq 'SCALAR') {
push @vars, $$_;
$start.$$_.$end;
$str =~ s/($escape)/$escape_char$1/g;
$str;
}
- } @$args);
+ } @$args ];
return wantarray ? ($string, @vars) : $string;
}
/bin/csh
echo $SHELL
/bin/csh
- perl -I$HOME/perl5/lib/perl5 -Mlocal::lib >> ~/.cshrc
+ echo 'eval `perl -I$HOME/perl5/lib/perl5 -Mlocal::lib`' >> ~/.cshrc
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
C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\tmp.bat
### instead of $(perl -Mlocal::lib=./)
-If you want the environment entries to persist, you'll need to add then to the
+If you want the environment entries to persist, you'll need to add them to the
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
directory is translated to a short name (which means the directory must exist)
and the subdirectories are created.
+=head3 PowerShell
+
+local::lib also supports PowerShell, and an be used with the
+C<Invoke-Expression> cmdlet.
+
+ Invoke-Expression "$(perl -Mlocal::lib)"
+
=head1 RATIONALE
The version of a Perl package on your machine is not always the version you