I've wanted to have this working for the longest time.
I write about as much proprietary code for clients as I do modules for CPAN (although the CPAN modules are done in smaller parts).
If anyone has seen the structure of my CPAN repository, I use the same structure for commercial code.
For each client, I have a repository with a trunk, that holds the main dists, a tools directory, and a releases directory, which holds master copies of the distribution tarballs, as they are created.
Since I moved to svn this also means that I can then pull releases on remote machines directly out the repository, and every release has an identifying URI.
As time has gone on, and I write larger and larger commercial apps, I find I want my commercial code to match my CPAN code more and more.
Now, I don't always have time to doc and test quite as thoroughly as for CPAN code, and it's the client's money so sometimes I skimp a bit if the implementation is clean. I'm moderately happy to do this.
But one area that I find really hurts me is that more and more I want to break up commercial distributions into smaller parts, in a CPAN-like resusable fashion.
But since some of my commercial apps are heading into the 20-30 distribution territory, it gets quite painful to install them. And remember that each of these 20-30 dists are going to have a number of CPAN dependencies as well.
What I've needed, at the very least, has been a way to take a list of distributions, and install them in order, while also recursing into their CPAN dependencies.
So far the only way I've seen to do this is via a minicpan mirror and the CPAN::Mini::Inject.
But maintaining a minicpan mirror repository in this way stinks to me of sysadmin work, and I'm a terrible sysadmin, so I've wanted a way to just install the dists directly.
With the creation of the LOCAL reserved CPAN author and the CPAN::Inject module to inject a distribution into the local CPAN cache without needing a mirror, I can finally achieve this.
With a mind to needing more functionality later, I've created an initial console implementation of this process of installing a set of distributions in order, but that I can extend later to add more functionality.
I've created a simple plan file, called a .p5i file (for Perl 5 Installer) that looks something like the following.
Module::Plan::Lite
Process-0.17.tar.gz
YAML-Tiny-0.10.tar.gz
subdir/Dist-Whatever-1.00.tar.gz
The first line is a class header, that specifies the class that implements the plan (Module::Plan::Lite comes by default, but I'll add more later), and each of the lines below is the name of a distribution tarball (where relative paths are relative to the .p5i file) to install, in the order they are to be installed.
This is quite rudimentary, but now I can at least keep a list of distributions in a simple file and then just run...
> sudo pip dir/program.p5i
And all those distributions will be installed in order, and the installer will automatically recurse up into CPAN modules that are dependencies of your third-party code and install them as normal.
This isn't quite as low-maintenance as I want, but it does reduce of the bulk of the typing.
It also means that down the track a bit, once we get access to cross-platform filename association capabilities, I can associate .p5i with pip and make a clickable cross-platform installer script for Perl 5 source installs, whether they are CPAN or non-CPAN or mixed.
This is also the first console application where I've moved the bulk of the console interface part of the code to a matching module, pip.pm.
So finally you can just install it by using
> sudo cpan pip
... and it will just Do What You Mean.
Finally, please note that this is a bit experimental still, and so a few things might move a bit yet.
But the basics of this should work just fine.