One of Perl’s cardinal strengths is the depth and variety of add-on modules to extend its capabilities, collected for the past 26 yearsand counting on CPAN, the Comprehensive Perl Archive Network. Starting with version 5.004in 1997, Perl has come packaged with a module (also called CPAN) and associated command-line client for downloading and installing from this service. Some developers favor alternative tools such as CPANPLUSand its cpanpcommand or cpanminusand its cpanm, or tools built on the latter such as Cartonand Carmel.
My favorite of these over the past several years has been Shoichi Kaji’s cpm, mainly because it’s blazingly fast. As an example, the documentation citesan installation of Plack, the Perl web application toolkit, as taking three times as long using cpanmversus cpm. Both use the same Menlocore code but cpmachieves its speed by breaking down dependencies into individual streams, installing modules in parallel, and synchronizing the necessary worker processes.
Shoichi’s presentationfrom The Perl Conference2016 provides a great summary:
cpm’ is fast” (2016)It’s very important to note that cpmis not a drop-in replacementfor the cpanor cpanmcommand-line tools. Firstly, it uses the subcommand install, e.g., cpm install Module::Name. Also, by default, it installs modules into a subdirectory named local/as if you specified cpanm --local-lib-contained local. You might want this if you’re setting up a Perl project with its non-core dependencies in a separate location addressed by the local::libmodule; otherwise, you should use cpm install --globalto install into a directory in Perl’s @INCarray. I tend to do the latter when developing, declaring my project’s dependencies in a cpanfile.
Speaking of cpanfiles, like cpanm --installdeps cpmwill use a cpanfileto drive project dependency installation. In fact, it defaults to looking for one if you don’t specify individual modules on the command line and supports the version-controlled cpanfile.snapshotfile introduced by Cartonfor tracking exact dependencies used by your project. This is great for repeatedly building Dockercontainers and cpmmakes that process even faster.
Although speed is its most important feature, cpmhas a couple more tricks up its sleeve like installing from a Gitrepository or self-hosted “DarkPAN.” Check out its included tutorial.


Comments
One response to “Fast Perl module installation with cpm”
[…] Fast Perl module installation with cpm […]