| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package App::local::lib::helper; |
|
2
|
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
1184
|
use strict; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
41
|
|
|
4
|
1
|
|
|
1
|
|
5
|
use warnings; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
30
|
|
|
5
|
1
|
|
|
1
|
|
15
|
use File::Spec; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
24
|
|
|
6
|
|
|
|
|
|
|
|
|
7
|
1
|
|
|
1
|
|
25
|
use 5.008005; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
1185
|
|
|
8
|
|
|
|
|
|
|
our $VERSION = '0.07'; |
|
9
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
sub run { |
|
11
|
0
|
|
|
0
|
0
|
|
my ($class, %opts) = @_; |
|
12
|
0
|
|
|
|
|
|
my $local_lib_helper = __PACKAGE__->new(%opts); |
|
13
|
0
|
|
|
|
|
|
return $local_lib_helper->create_local_lib_helper; |
|
14
|
|
|
|
|
|
|
} |
|
15
|
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
sub _diag { |
|
17
|
0
|
|
|
0
|
|
|
my $self = shift @_; |
|
18
|
0
|
|
|
|
|
|
print STDERR @_, "\n"; |
|
19
|
|
|
|
|
|
|
} |
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
sub diag { |
|
22
|
0
|
|
|
0
|
0
|
|
shift->_diag(@_); |
|
23
|
|
|
|
|
|
|
} |
|
24
|
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
sub error { |
|
26
|
0
|
|
|
0
|
0
|
|
shift->_diag(@_); |
|
27
|
0
|
|
|
|
|
|
die "Exiting with Errors"; |
|
28
|
|
|
|
|
|
|
} |
|
29
|
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
sub new { |
|
31
|
0
|
|
|
0
|
0
|
|
my ($class, %opts) = @_; |
|
32
|
0
|
|
|
|
|
|
return bless \%opts, $class; |
|
33
|
|
|
|
|
|
|
} |
|
34
|
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
sub create_local_lib_helper { |
|
36
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
|
37
|
0
|
0
|
|
|
|
|
if (my $target = $self->{target}) { |
|
|
|
0
|
|
|
|
|
|
|
38
|
0
|
|
|
|
|
|
return $self->_create_local_lib_helper($target); |
|
39
|
|
|
|
|
|
|
} elsif ($self->has_local_lib_env) { |
|
40
|
0
|
|
|
|
|
|
my ($install_base, $target) = |
|
41
|
0
|
|
|
|
|
|
map {split '=', $_} |
|
42
|
0
|
|
|
|
|
|
grep { m/^INSTALL_BASE/ } |
|
43
|
|
|
|
|
|
|
split ' ', $ENV{PERL_MM_OPT}; |
|
44
|
0
|
|
|
|
|
|
$self->diag("My target local::lib is $target"); |
|
45
|
0
|
|
|
|
|
|
$self->_create_local_lib_helper_bashrc($target); |
|
46
|
0
|
|
|
|
|
|
$self->_create_local_lib_helper_cshrc($target); |
|
47
|
0
|
|
|
|
|
|
$self->_create_local_lib_helper_relative($target); |
|
48
|
0
|
|
|
|
|
|
$self->_create_local_lib_helper($target); |
|
49
|
0
|
|
|
|
|
|
return 1; |
|
50
|
|
|
|
|
|
|
} |
|
51
|
|
|
|
|
|
|
|
|
52
|
0
|
|
|
|
|
|
$self->diag(<
|
|
53
|
|
|
|
|
|
|
! |
|
54
|
|
|
|
|
|
|
! You are not installing the helper script while in a local::lib context nor |
|
55
|
|
|
|
|
|
|
! have you specified the local::lib target directory via the --local_lib |
|
56
|
|
|
|
|
|
|
! commandline option. I don't know how to install the helper script. |
|
57
|
|
|
|
|
|
|
! |
|
58
|
|
|
|
|
|
|
DIAG |
|
59
|
|
|
|
|
|
|
} |
|
60
|
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
sub has_local_lib_env { |
|
62
|
0
|
0
|
0
|
0
|
0
|
|
if( |
|
|
|
|
0
|
|
|
|
|
|
63
|
|
|
|
|
|
|
$ENV{PERL_MM_OPT} and |
|
64
|
|
|
|
|
|
|
($ENV{MODULEBUILDRC} or $ENV{PERL_MB_OPT}) |
|
65
|
|
|
|
|
|
|
) { |
|
66
|
0
|
|
|
|
|
|
return 1; |
|
67
|
|
|
|
|
|
|
} else { |
|
68
|
0
|
|
|
|
|
|
return; |
|
69
|
|
|
|
|
|
|
} |
|
70
|
|
|
|
|
|
|
} |
|
71
|
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
sub _create_file { |
|
73
|
0
|
|
|
0
|
|
|
my ($self, $filename, $permissions, $text) = @_; |
|
74
|
0
|
0
|
|
|
|
|
open (my $fh, '>', $filename) |
|
75
|
|
|
|
|
|
|
|| $self->error("Can't open $filename", $!); |
|
76
|
|
|
|
|
|
|
|
|
77
|
0
|
|
|
|
|
|
print $fh $text; |
|
78
|
|
|
|
|
|
|
|
|
79
|
0
|
|
|
|
|
|
close($fh); |
|
80
|
0
|
|
|
|
|
|
chmod oct($permissions), $filename; |
|
81
|
0
|
|
|
|
|
|
return $filename; |
|
82
|
|
|
|
|
|
|
} |
|
83
|
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
sub _find_or_create_lib_bindir_from { |
|
85
|
0
|
|
|
0
|
|
|
my ($self, $target) = @_; |
|
86
|
0
|
|
|
|
|
|
my $lib = File::Spec->catdir($target, 'lib', 'perl5'); |
|
87
|
0
|
|
|
|
|
|
my $bindir = File::Spec->catdir($target, 'bin'); |
|
88
|
0
|
0
|
|
|
|
|
mkdir $bindir unless(-e $bindir); |
|
89
|
0
|
|
|
|
|
|
return ($lib, $bindir); |
|
90
|
|
|
|
|
|
|
} |
|
91
|
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
sub _create_local_lib_helper { |
|
93
|
0
|
|
|
0
|
|
|
my ($self, $target) = @_; |
|
94
|
0
|
|
|
|
|
|
my ($lib, $bindir) = $self->_find_or_create_lib_bindir_from($target); |
|
95
|
0
|
|
|
|
|
|
my $bin = File::Spec->catdir($bindir, $self->{helper_name}); |
|
96
|
0
|
|
|
|
|
|
$self->_create_file($bin, $self->{helper_permissions}, <
|
|
97
|
|
|
|
|
|
|
#!$self->{which_perl} |
|
98
|
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
use strict; |
|
100
|
|
|
|
|
|
|
use warnings; |
|
101
|
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
use lib '$lib'; |
|
103
|
|
|
|
|
|
|
use local::lib '$target'; |
|
104
|
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
unless ( caller ) { |
|
106
|
|
|
|
|
|
|
if ( \@ARGV ) { |
|
107
|
|
|
|
|
|
|
exec \@ARGV; |
|
108
|
|
|
|
|
|
|
} |
|
109
|
|
|
|
|
|
|
} |
|
110
|
|
|
|
|
|
|
END |
|
111
|
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
} |
|
113
|
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
sub _create_local_lib_helper_relative { |
|
115
|
0
|
|
|
0
|
|
|
my ($self, $target) = @_; |
|
116
|
0
|
|
|
|
|
|
my ($lib, $bindir) = $self->_find_or_create_lib_bindir_from($target); |
|
117
|
0
|
|
|
|
|
|
my $bin = File::Spec->catdir($bindir, $self->{helper_name}.'-relative'); |
|
118
|
0
|
|
|
|
|
|
$self->_create_file($bin, $self->{helper_permissions}, <
|
|
119
|
|
|
|
|
|
|
#!/usr/bin/env perl |
|
120
|
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
use strict; |
|
122
|
|
|
|
|
|
|
use warnings; |
|
123
|
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
use FindBin; |
|
125
|
|
|
|
|
|
|
use File::Spec; |
|
126
|
|
|
|
|
|
|
use lib File::Spec->catdir(\$FindBin::Bin, '..', 'lib', 'perl5'); |
|
127
|
|
|
|
|
|
|
use local::lib File::Spec->catdir(\$FindBin::Bin, '..'); |
|
128
|
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
unless ( caller ) { |
|
130
|
|
|
|
|
|
|
if ( \@ARGV ) { |
|
131
|
|
|
|
|
|
|
exec \@ARGV; |
|
132
|
|
|
|
|
|
|
} |
|
133
|
|
|
|
|
|
|
} |
|
134
|
|
|
|
|
|
|
END |
|
135
|
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
} |
|
137
|
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
sub _create_local_lib_helper_bashrc { |
|
139
|
0
|
|
|
0
|
|
|
my ($self, $target) = @_; |
|
140
|
0
|
|
|
|
|
|
my ($lib, $bindir) = $self->_find_or_create_lib_bindir_from($target); |
|
141
|
0
|
|
|
|
|
|
my $bin = File::Spec->catdir($bindir, $self->{helper_name}.'-bashrc'); |
|
142
|
0
|
|
|
|
|
|
$self->_create_file($bin, $self->{helper_permissions}, <
|
|
143
|
|
|
|
|
|
|
eval \$($self->{which_perl} -I$lib -Mlocal::lib=$target) |
|
144
|
|
|
|
|
|
|
END |
|
145
|
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
} |
|
147
|
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
sub _create_local_lib_helper_cshrc { |
|
149
|
0
|
|
|
0
|
|
|
my ($self, $target) = @_; |
|
150
|
0
|
|
|
|
|
|
my ($lib, $bindir) = $self->_find_or_create_lib_bindir_from($target); |
|
151
|
0
|
|
|
|
|
|
my $bin = File::Spec->catdir($bindir, $self->{helper_name}.'-cshrc'); |
|
152
|
0
|
|
|
|
|
|
$self->_create_file($bin, $self->{helper_permissions}, <
|
|
153
|
|
|
|
|
|
|
$self->{which_perl} -I$lib -Mlocal::lib=$target |
|
154
|
|
|
|
|
|
|
END |
|
155
|
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
} |
|
157
|
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
1; |
|
159
|
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
=head1 NAME |
|
161
|
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
App::local::lib::helper - Make it easy to run code against a local-lib |
|
163
|
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
165
|
|
|
|
|
|
|
|
|
166
|
|
|
|
|
|
|
Installing and using the helper (common usage) |
|
167
|
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
cpanm --local-lib ~/mylib App::local::lib::helper |
|
169
|
|
|
|
|
|
|
~/mylib/bin/localenv bash |
|
170
|
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
Customizing the helper creation (advanced use only) |
|
172
|
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
use App::local::lib::helper; |
|
174
|
|
|
|
|
|
|
App::local::lib::helper->run(%opts); |
|
175
|
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
Note, if you don't have C already installed you can use the web service |
|
177
|
|
|
|
|
|
|
version like so instead for all examples: |
|
178
|
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
curl -L http://cpanmin.us/ | perl - --local-lib ~/mylib App::local::lib::helper |
|
180
|
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
182
|
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
This is an object which provide the functionality to create a L |
|
184
|
|
|
|
|
|
|
'helper' script in either the currently loaded L environment or in |
|
185
|
|
|
|
|
|
|
a target directory of choice. By default the script is called C and |
|
186
|
|
|
|
|
|
|
can be used to invoke a command under the L which it was built |
|
187
|
|
|
|
|
|
|
against. For example, assume you build a L like so: |
|
188
|
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
cpanm --local-lib ~/mylib App::local::lib::helper |
|
190
|
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
Note what is happening. First, you are telling cpanminus to install everything |
|
192
|
|
|
|
|
|
|
to a local::lib directory called C<~/mylib> (cpanminus behind the scenes uses |
|
193
|
|
|
|
|
|
|
L to do this for you) then you are telling cpanminus to install the |
|
194
|
|
|
|
|
|
|
distribution L into that created L directory. |
|
195
|
|
|
|
|
|
|
When the C script for L runs, it notices |
|
196
|
|
|
|
|
|
|
the fact that it is being asked to install into a locally lib managed directory |
|
197
|
|
|
|
|
|
|
and will additionally generate a helper script into C<~/mylib/bin> called C. |
|
198
|
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
Now, if you want to invoke a perl application and use libs installed into |
|
200
|
|
|
|
|
|
|
C<~/mylib>, you can do so like: |
|
201
|
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
~/mylib/bin/localenv perl [SOME COMMAND] |
|
203
|
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
The command C will make sure the same L that was active |
|
205
|
|
|
|
|
|
|
when L was originally installed is again installed |
|
206
|
|
|
|
|
|
|
into the environment before executing the commands passed in C<@ARGV>. Upon |
|
207
|
|
|
|
|
|
|
completing the command, the C<%ENV> is restored so that you can use this to fire |
|
208
|
|
|
|
|
|
|
off an application against a specific L without needing to deal |
|
209
|
|
|
|
|
|
|
with the details of how to activate the L or how to make sure |
|
210
|
|
|
|
|
|
|
your C<%ENV> stays clean. |
|
211
|
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
The arguments given to C don't need to be a perl application. For |
|
213
|
|
|
|
|
|
|
example, I often like to open a sub shell under a particular L |
|
214
|
|
|
|
|
|
|
managed directory. |
|
215
|
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
~/mylib/bin/localenv bash |
|
217
|
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
Now, if I do: |
|
219
|
|
|
|
|
|
|
|
|
220
|
|
|
|
|
|
|
perl -V |
|
221
|
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
I'll see that iC<~/mylib> has been added to C<@INC>. Additionally, C<~/mylib/bin> will |
|
223
|
|
|
|
|
|
|
have been added to C<$PATH>, so that any command line perl applications installed |
|
224
|
|
|
|
|
|
|
into the L (such as C or C) can be accessed easily. |
|
225
|
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
Another example usage would be when you want to install an application from |
|
227
|
|
|
|
|
|
|
CPAN, install it and all its dependencies to a single directory root and |
|
228
|
|
|
|
|
|
|
then run it without a lot of effort. For example: |
|
229
|
|
|
|
|
|
|
|
|
230
|
|
|
|
|
|
|
cpanm --local-lib ~/gitalyst-libs Gitalist App::local::lib::helper |
|
231
|
|
|
|
|
|
|
~/gitalyst-libs/bin/localenv gitalyst-server.pl |
|
232
|
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
And presto! Your cpan installed application is running, fully self-contained to |
|
234
|
|
|
|
|
|
|
one root directory all under regular user privileges. |
|
235
|
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
L does all the real work, but I find this to be the easiest way to |
|
237
|
|
|
|
|
|
|
run given code against a L root. |
|
238
|
|
|
|
|
|
|
|
|
239
|
|
|
|
|
|
|
=head2 Additional Helpers |
|
240
|
|
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
In addition to the C script which is documented above, we also create |
|
242
|
|
|
|
|
|
|
two snippets of code suitable for including in your C<.bashrc> or C<.cshrc>. |
|
243
|
|
|
|
|
|
|
These are created to help people that only want or need a single local lib and |
|
244
|
|
|
|
|
|
|
would like to activate it at login. If you'd like to use these, simple add the |
|
245
|
|
|
|
|
|
|
following tot he end of your C<.bashrc> |
|
246
|
|
|
|
|
|
|
|
|
247
|
|
|
|
|
|
|
source $TARGET/bin/localenv-bashrc |
|
248
|
|
|
|
|
|
|
|
|
249
|
|
|
|
|
|
|
Where $TARGET is the root of your local lib (the directory that contains your |
|
250
|
|
|
|
|
|
|
C and C directories created when you ran the helper). |
|
251
|
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
Next time you log in, you can do C and should see that your local-lib |
|
253
|
|
|
|
|
|
|
has automatically been activated. |
|
254
|
|
|
|
|
|
|
|
|
255
|
|
|
|
|
|
|
There will also be a C created for those of |
|
256
|
|
|
|
|
|
|
you using csh. Currently this is not going to work with Windows shell users, |
|
257
|
|
|
|
|
|
|
but should be easy to setup, collaborations very welcomed. |
|
258
|
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
=head1 OPTIONS |
|
260
|
|
|
|
|
|
|
|
|
261
|
|
|
|
|
|
|
This class supports the following options. |
|
262
|
|
|
|
|
|
|
|
|
263
|
|
|
|
|
|
|
=over 4 |
|
264
|
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
=item which_perl |
|
266
|
|
|
|
|
|
|
|
|
267
|
|
|
|
|
|
|
This should be the path to the perl binary that the L is built |
|
268
|
|
|
|
|
|
|
against. This defaults to the path of the perl binary under which we are |
|
269
|
|
|
|
|
|
|
currently running. You should probably leave this one alone :) |
|
270
|
|
|
|
|
|
|
|
|
271
|
|
|
|
|
|
|
=item target |
|
272
|
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
This is the target directory for the L you want to build the helper |
|
274
|
|
|
|
|
|
|
script against. By default it will attempt to detect the currently running |
|
275
|
|
|
|
|
|
|
L and use that. If we can't detect a running L and |
|
276
|
|
|
|
|
|
|
this option is undef, we die with a message. |
|
277
|
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
=item helper_name |
|
279
|
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
This is the name of the helper utility script. It defaults to 'localenv'. |
|
281
|
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
=item helper_permissions |
|
283
|
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
These are the permissions the the helper utility script is set to. By default |
|
285
|
|
|
|
|
|
|
we set the equivilent of 'chmod 755 [HELPER SCRIPT]' |
|
286
|
|
|
|
|
|
|
|
|
287
|
|
|
|
|
|
|
=back |
|
288
|
|
|
|
|
|
|
|
|
289
|
|
|
|
|
|
|
=head1 HELPERS |
|
290
|
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
This distribution installs the following L helpers |
|
292
|
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
=head2 localenv |
|
294
|
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
This is a perl script that runs a single command in L aware context. |
|
296
|
|
|
|
|
|
|
You can use the C option to set a different name. |
|
297
|
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
Typically I will use this to 'enable' a previously setup L with |
|
299
|
|
|
|
|
|
|
commands like: |
|
300
|
|
|
|
|
|
|
|
|
301
|
|
|
|
|
|
|
~/mylocallib/bin/localenv bash |
|
302
|
|
|
|
|
|
|
~/mylocallib/bin/localenv screen |
|
303
|
|
|
|
|
|
|
|
|
304
|
|
|
|
|
|
|
Or I can use it to run a single command wrapped in the L target |
|
305
|
|
|
|
|
|
|
and exit cleanly: |
|
306
|
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
~/mylocallib/bin/localenv perl app.pl |
|
308
|
|
|
|
|
|
|
~/mylocallib/bin/localenv plackup app.psgi |
|
309
|
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
=head2 localenv-relative |
|
311
|
|
|
|
|
|
|
|
|
312
|
|
|
|
|
|
|
NOTE: Experimental feature. Please prefer using L unless you |
|
313
|
|
|
|
|
|
|
absolutely need this functionality. |
|
314
|
|
|
|
|
|
|
|
|
315
|
|
|
|
|
|
|
This perl script functions (or should function) identically to L as |
|
316
|
|
|
|
|
|
|
documented. However, instead of having hardcoded full paths to your Perl |
|
317
|
|
|
|
|
|
|
binary and L target directories, we instead try to use relative |
|
318
|
|
|
|
|
|
|
pathing. For example, here is the helper script built on my server for the |
|
319
|
|
|
|
|
|
|
standard L script: |
|
320
|
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
#!/Users/johnn/perl5/perlbrew/perls/perl-5.14.1/bin/perl |
|
322
|
|
|
|
|
|
|
|
|
323
|
|
|
|
|
|
|
use strict; |
|
324
|
|
|
|
|
|
|
use warnings; |
|
325
|
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
use lib '/Users/johnn/locallib_5_14_1/lib/perl5'; |
|
327
|
|
|
|
|
|
|
use local::lib '/Users/johnn/locallib_5_14_1'; |
|
328
|
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
unless ( caller ) { |
|
330
|
|
|
|
|
|
|
if ( @ARGV ) { |
|
331
|
|
|
|
|
|
|
exec @ARGV; |
|
332
|
|
|
|
|
|
|
} |
|
333
|
|
|
|
|
|
|
} |
|
334
|
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
And here is the example same version for the relative script: |
|
336
|
|
|
|
|
|
|
|
|
337
|
|
|
|
|
|
|
#!/usr/bin/env perl |
|
338
|
|
|
|
|
|
|
|
|
339
|
|
|
|
|
|
|
use strict; |
|
340
|
|
|
|
|
|
|
use warnings; |
|
341
|
|
|
|
|
|
|
|
|
342
|
|
|
|
|
|
|
use FindBin; |
|
343
|
|
|
|
|
|
|
use File::Spec; |
|
344
|
|
|
|
|
|
|
use lib File::Spec->catdir($FindBin::Bin, '..', 'lib', 'perl5'); |
|
345
|
|
|
|
|
|
|
use local::lib File::Spec->catdir($FindBin::Bin, '..'); |
|
346
|
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
unless ( caller ) { |
|
348
|
|
|
|
|
|
|
if ( @ARGV ) { |
|
349
|
|
|
|
|
|
|
exec @ARGV; |
|
350
|
|
|
|
|
|
|
} |
|
351
|
|
|
|
|
|
|
} |
|
352
|
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
The goal here is to be more friendly when you need to relocate your |
|
354
|
|
|
|
|
|
|
installation of Perl and/or your L target directory. You might |
|
355
|
|
|
|
|
|
|
wish to try this if you are copying a 'seed' Perl and L setup to |
|
356
|
|
|
|
|
|
|
multiple developer home directories (as a way to speed up first time developer |
|
357
|
|
|
|
|
|
|
setup, for example) or if your deployment system copies your application from |
|
358
|
|
|
|
|
|
|
your build enviroment to a QA or Production that is not identical. |
|
359
|
|
|
|
|
|
|
|
|
360
|
|
|
|
|
|
|
Personally I prefer to build Perl and my application in each location that is |
|
361
|
|
|
|
|
|
|
different, since I find that works very effectively. However I understand some |
|
362
|
|
|
|
|
|
|
shops have existing build systems that deploy code by copying Perl dependencies |
|
363
|
|
|
|
|
|
|
from box to box, and these boxes are not always identical in directory layout. |
|
364
|
|
|
|
|
|
|
For example, there might be a build or integration point in development, with |
|
365
|
|
|
|
|
|
|
a L target of C and you |
|
366
|
|
|
|
|
|
|
wish to copy that directory recursively to your qa/production server, which |
|
367
|
|
|
|
|
|
|
might be located at C. |
|
368
|
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
I'd like to accomodate this approach as best I can, however I can't be certain |
|
370
|
|
|
|
|
|
|
that moving Perl and L around rather than performing a true install |
|
371
|
|
|
|
|
|
|
is going to work consistently. Caveat emptor! |
|
372
|
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
Please also note that the following shell snippets are not relative tested. |
|
374
|
|
|
|
|
|
|
|
|
375
|
|
|
|
|
|
|
=head2 localenv-bashrc |
|
376
|
|
|
|
|
|
|
|
|
377
|
|
|
|
|
|
|
a snippet suitable for sourcing in your .bashrc, which will automatically |
|
378
|
|
|
|
|
|
|
activate a local-lib at login. Name will follow from C. |
|
379
|
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
Here's an example of the line I might add to .bashrc (assumes you have setup |
|
381
|
|
|
|
|
|
|
L in C<$HOME/mylocal> |
|
382
|
|
|
|
|
|
|
|
|
383
|
|
|
|
|
|
|
source $HOME/mylocal/localenv-bashrc |
|
384
|
|
|
|
|
|
|
|
|
385
|
|
|
|
|
|
|
Then next time you open a shell you should see that C<$PATH> and C |
|
386
|
|
|
|
|
|
|
have been properly changed. |
|
387
|
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
=head2 localenv-cshrc |
|
389
|
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
a snippet suitable for sourcing in your .cshrc, which will automatically |
|
391
|
|
|
|
|
|
|
activate a local-lib at login. Name will follow from C. |
|
392
|
|
|
|
|
|
|
|
|
393
|
|
|
|
|
|
|
|
|
394
|
|
|
|
|
|
|
=head1 AUTHOR |
|
395
|
|
|
|
|
|
|
|
|
396
|
|
|
|
|
|
|
John Napiorkowski C< <> > |
|
397
|
|
|
|
|
|
|
|
|
398
|
|
|
|
|
|
|
=head1 COPYRIGHT & LICENSE |
|
399
|
|
|
|
|
|
|
|
|
400
|
|
|
|
|
|
|
Copyright 2011, John Napiorkowski |
|
401
|
|
|
|
|
|
|
|
|
402
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify it under |
|
403
|
|
|
|
|
|
|
the same terms as Perl itself. |
|
404
|
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
=cut |
|
406
|
|
|
|
|
|
|
|
|
407
|
|
|
|
|
|
|
|