What is the difference between the cpan
and cpanm
commands?
They both seem to install perl
modules, so what is the difference?
cpan
the CPAN shell has been shipped with Perl since about 1997. When you run it the first time it asks a bunch of questions and saves the answers in a config file. Then you can install a module by running:
cpan -i Module::Name
The shell provides other commands for searching CPAN and looking inside distribution files.
A project to create a newer, better and more featureful CPAN shell called CPANPLUS (cpanp
from the command-line) was started by Jos Boumans, but it was never quite completed to the point where the original vision had been realised.
Meanwhile MIYAGAWA decided that cpanp
was trying to do too much and what the world really needed was a simpler shell that did less and asked fewer questions (ideally none at all). He created App::cpanminus which provides the cpanm
command and does exactly what he intended. You can use it to install a module (and all the module's dependencies) with a command like:
cpanm Module::Name
The main difference between the two is that if you have Perl you should already have the cpan
command. Whereas you won't have cpanm
unless/until you install it.
Most modern Perl users prefer cpanm
for it's simplicity and mainly, brevity of output.
Using cpan
can result in hundreds of lines of output as it shows you everything it's doing: downloading, checksum, running installer, parsing, loading, the list goes on. The same applies to every dependency.
cpanm
on the other hand tells you what it is doing in a more terse and general way, that is: Fetching, Configuring, Building and testing, Done.
So the main difference in usage is that cpanm
suppresses a lot of (typically) irrelevant information. Sometimes when a module fails, you might want more information. There's a -v|--verbose
flag that essentially shows you everything cpan
would.
Also, some modules that require user input may seem to 'hang' when you try to install them. That's because the output that's asking you to type something is suppressed. You can use the --interactive
(or --verbose
) flags to work around that.
For a comparison of the output, see slides 35-39 here or slides 37-41 here. (These are from the same presentation. I'm just duplicating the links in case one goes off line.)