[Melbourne-pm] How to build a local module repository
Paul Fenwick
pjf at perltraining.com.au
Sun Jun 1 21:01:57 PDT 2008
G'day Ian,
Ian Macdonald wrote:
> Does anybody have any better ideas, or can see problems with where we're
> going?
I agree with Toby's comments about using the native OS packaging system, but
I'm not sure if any such thing exists for Windows.
I believe that using CPAN::Site or a similar technology (eg, CPAN::Mini) to
essentially make your own CPAN is a fine idea. It means you get the modules
you want, in the locations your Perl expects them to be. However I've not
used either CPAN::Site or CPAN::Mini, so I can't comment on its
effectiveness. It certainly sounds like the traditional thing to do.
Depending upon your circumstances, you may also wish to use PAR. You'll
take both a space and a time hit on start-up, but it makes it very easy to
bundle all the modules you need into a single archive, and then use that.
For example, you can bundle all the modules required by a program into a
single file with:
pp -p -o mymodules.par myscript.pl
You can then include in your program:
use PAR 'mymodules.par';
use Foo::Bar;
use Bar::Baz;
and your code will automatically extract and load them from mymodules.par if
they exist.
You can even run the .par file directly (since it will also contains your
script) with:
parl mymodules.par
Perl Training Australia has recently written a Perl tip on PAR at:
http://perltraining.com.au/tips/2008-05-23.html
PAR has pretty minimum dependencies. Distributing it to your target
machines should be easier than distributing all the modules. In fact, you
can even use PAR to build stand-alone .exes that don't require perl at all,
or .pl files which contain their own module archive. Of course, you'll take
a speed and space hit to do so.
However, using PAR isn't all roses. You should be aware that:
* You'll take a time AND space hit by using PAR, since
modules will need to be extracted from the .par file.
This isn't too bad, since PAR will cache the extracted
modules locally, so you only get a big hit the first time.
* There's currently a bug in parl, because it *always* uses
the same cache directory. This means that if you have two
different programs built into .par files, and they contain
different versions of the same module or file, then only
one of those modules will ever get used.
* It doesn't always work with all modules. In particular, if
there are .dll or .so files that need to be bundled, you may
have to provide hints. In our perl-tip we've got a link
to SweeperBot's builder, which demonstrates how to link in
the various Image::Magick .dll files.
* Unless you're using pure-perl modules, you'll need a full
install of all the modules you want to use on a system
with identical architecture where you're using 'pp' to build
your .par files.
* Systems built with PAR won't necessarily pick up upgraded
modules that are on your systems; so if you're already going
to the work of maintaining good installs of all your modules,
PAR may make your distribution headaches worse.
> PS on a related note; we've also thought about installing CPAN modules
> on new boxes by simply copying the perl/site directory from a working
> box. Assuming that the OS matches down to the patch level, is this a
> safe approach?
Well, you'll hit the same problems as we do with PAR when there are .dll/.so
or other dependencies that don't necessarily live in perl/site. It also
sounds rather difficult when it comes to backing out the changes; with a
.par file you just delete the file.
I've not tried copying the directories myself, so YMMV.
Cheerio,
Paul
--
Paul Fenwick <pjf at perltraining.com.au> | http://perltraining.com.au/
Director of Training | Ph: +61 3 9354 6001
Perl Training Australia | Fax: +61 3 9354 2681
More information about the Melbourne-pm
mailing list