Exclusive Perl Archive Nook
I started working on epan, a (somewhat thin) wrapper around cpanminus to create a version of CPAN trimmed down to your needs for installing specific stuff.
This is what the cool guys probably call DPAN these days, but I found that the whole concept of DarkPAN revolves much around getting your private stuff into the "normal" Perl toolchain, while in this case I need to be able to easily install modules in machines that are out of Internet reach.
To start with an example, suppose you have to install Dancer and a couple of its plugins in a machine that - for good reasons - is not connected to the Internet. It's easy to get the distribution files for Dancer and the plugins... but what about the dependencies? It can easily become a nightmare, forcing you to go back and forth with new modules as soon as you discover the need to install them.
Thanks to cpanminus, this is quite easier these days: it can actually do what's needed with a single command:
# on the machine connected to the Internet or to a minicpan
$ cpanm -L xxx --scandeps --save-dists dists \
Dancer Dancer::Plugin::FlashNote ...
which places all the modules in subdirectory dists
(thanks to option
--save-dists
) with an arrangement similar to what you would expect
from a CPAN mirror. Alas, on the target machine, you still have to make
some work - e.g. you should collect the output from the invocation of
cpanm above to figure out the order to use for installing the distribution files.
Additionally, the directory structure that is generated lacks a proper
index file (located in modules/02package.details.txt.gz
) so it would be
difficult to use the normal toolchain.
epan aims at filling up the last mile to get the job done, providing you with a subdirectory that is ready for deployment, with all the bits in place to push automation as much as possible. So you can do this:
# on the machine connected to the Internet or to a minicpan
$ epan create Dancer Dancer::Plugin::FlashNote ...
$ tar cvzf epan.tar.gz epan
transfer epan.tar.gz
to the target machine and...
# on the target machine
$ tar xvzf epan.tar.gz
$ cd epan
$ ./install.sh
optionally providing an installation target directory:
$ ./install.sh /path/to/local/perl
The epan directory that is generated should be compatible with other tools - in particular, the modules/02package.details.txt.gz
file is generated, so all the toolchain (including cpan
) should play nicely with it.
This is nice though I was wondering if it was not more simple to create a cpan mirror using CPAN::Mini and use that directly?
Anyway I hope we will have some kind of an integrated end-to-end solution as well.
I think you've just re-invented Carton, by the same author as cpanminus, Miyagawa.
See if this doesn't do exactly what you want:
https://metacpan.org/release/carton
@Gabor: I recently re-created a CPAN::Mini mirror and it was 1.4GB - a bit overkill when all you have to do is install some modules that fit into a few MB.
@Pedro: Carton seems way wider... thank you for saying that I reinvented it ;-) Jokes apart, it seems that `carton bundle` and `carton install --cached` accomplish the same goal (more or less). One thing that I didn't find very clear is how difficult is to get carton installed on the target machine - might be a chicken-and-egg problem for my particular installation needs.