TL;DR

I released App::EPAN.

A lot of people proposed solutions for keeping some version of a local CPAN, for various reasons (like, e.g., keeping a DarkPAN, that is a CPAN-like mirror with private modules).

In spirit of good wheel reinvention, about 10 years ago I coded epan and… never released it on CPAN. Until now.

Most of the work is done by cpanm, which includes saving the downloaded distribution files into an appropriate directory. But… those files cannot be used (not even by cpanm, as I understand it) directly without some indexes, which is where App::EPAN kicks in.

Similarly, Carton can save the files (and actually use them!), but you cannot use those files with a CPAN client directly. Which, again, is a small use case for App::EPAN.

Using it is simple, e.g. to create a local repository with Mojolicious and IO::Socket::SSL:

$ epan create Mojolicious IO::Socket::SSL
[2021/06/12 18:20:04 INFO ] calling cpanm --reinstall --quiet --self-contained --notest --local-lib-contained epan/local --save-dists epan Mojolicious IO::Socket::SSL
Successfully installed Mojolicious-9.19
Successfully installed Net-SSLeay-1.90
Successfully installed Mozilla-CA-20200520
Successfully installed IO-Socket-SSL-2.071
4 distributions installed
[2021/06/12 18:20:24 INFO ] onboarding completed, indexing...
[2021/06/12 18:20:24 INFO ] saving output to epan/authors/01mailrc.txt.gz
[2021/06/12 18:20:24 INFO ] saving output to epan/modules/02packages.details.txt.gz
[2021/06/12 18:20:24 INFO ] getting contributions for regenerated index...
[2021/06/12 18:20:24 INFO ] indexing epan/authors/id/C/CH/CHRISN/Net-SSLeay-1.90.tar.gz
[2021/06/12 18:20:24 INFO ] indexing epan/authors/id/S/SR/SRI/Mojolicious-9.19.tar.gz
[2021/06/12 18:20:25 INFO ] indexing epan/authors/id/S/SU/SULLR/IO-Socket-SSL-2.071.tar.gz
[2021/06/12 18:20:25 INFO ] indexing epan/authors/id/A/AB/ABH/Mozilla-CA-20200520.tar.gz
[2021/06/12 18:20:25 INFO ] saving output to epan/modules/03modlist.data.gz
[2021/06/12 18:20:25 INFO ] saving distlist
[2021/06/12 18:20:25 INFO ] saving modlist

This creates a sub-directory epan with all stuff inside. If you don’t like this… just change the name with option -t!

Well enough for today… if you need something like this, give App::EPAN a try!