What's the easiest way to install a missing Perl module?
Asked Answered
F

24

244

I get this error:

Can't locate Foo.pm in @INC

Is there an easier way to install it than downloading, untarring, making, etc?

Flake answered 15/9, 2008 at 19:16 Comment(2)
If the module in question is a core module, consult How to fix “Can't locate Archive/Tar.pm”.Jenifer
Be very careful concerning the security: what is needed to ensure that the modules have not been modified must be downloaded in a secure way from a trusted site. See my answer about the use of cpan.Enenstein
T
277

On Unix:

usually you start cpan in your shell:

$ cpan

and type

install Chocolate::Belgian

or in short form:

cpan Chocolate::Belgian

On Windows:

If you're using ActivePerl on Windows, the PPM (Perl Package Manager) has much of the same functionality as CPAN.pm.

Example:

$ ppm
ppm> search net-smtp
ppm> install Net-SMTP-Multipart

see How do I install Perl modules? in the CPAN FAQ

Many distributions ship a lot of perl modules as packages.

  • Debian/Ubuntu: apt-cache search 'perl$'
  • Arch Linux: pacman -Ss '^perl-'
  • Gentoo: category dev-perl

You should always prefer them as you benefit from automatic (security) updates and the ease of removal. This can be pretty tricky with the cpan tool itself.

For Gentoo there's a nice tool called g-cpan which builds/installs the module from CPAN and creates a Gentoo package (ebuild) for you.

Taper answered 15/9, 2008 at 19:17 Comment(7)
IIRC the latest ActivePerl no longer has command-line ppm, it now opens a fancy GUI.Summit
Just "ppm" opens the GUI, but followed by commands it stays at the command line. So, "ppm help", "ppm install ...", etc.Almeta
Note that ppm uses dashes for the module path separator not the usual double colons. (Perhaps because colons mean drives in dos?) That has got me a few times ;)Polysyllabic
@MatthewLock: ppm uses hyphens - because you specify the distribution that you want to install, which is a lot more honest. For instance, if you use cpan to install LWP, LWP::Simple or LWP::UserAgent it will install the distribution libwww-perl for you. The majority of distributions contain a single module with an equivalent name, but there are several exceptions like thatAnselmo
For UNIX and MacOS, need to execute as root or with sudo. Otherwise, there will be a permission error.Zamir
note that the module name is case sensitive!Polysyllabic
It's possible to install modules with Cpan in Windows too, even with ActiveState perl. Note that it doesn't always seem to install dependent modules which you can see as errors in your Cpan installs. So I ended up using Cpan to install some modules that weren't in PPM, and PPM to install the dependent modules.Polysyllabic
S
70

Try App::cpanminus:

# cpanm Chocolate::Belgian

It's great for just getting stuff installed. It provides none of the more complex functionality of CPAN or CPANPLUS, so it's easy to use, provided you know which module you want to install. If you haven't already got cpanminus, just type:

# cpan App::cpanminus

to install it.

It is also possible to install it without using cpan at all. The basic bootstrap procedure is,

curl -L http://cpanmin.us | perl - --sudo App::cpanminus

For more information go to the App::cpanminus page and look at the section on installation.

Sculptor answered 15/9, 2008 at 19:16 Comment(3)
Using cpan to install App::cpanminus is a bit odd. The normal install instructions involve a bootstrapping procedure of downloading a part of it from cpanmin.us and using that to install the rest. This avoids the configuration of cpan and the creation of a (thereafter) useless .cpan directory.Flickertail
On Ubuntu, you can just install cpanminus from terminal. I find cpanm better than cpan because it doesn't put error logs on screen rather stores them in temporary log files and gives the path in case of errors.Zashin
I am getting this error when trying your command: Can't locate strict.pm in @INC (you may need to install the strict module) (@INC contains: /etc/perlBarram
L
29

I note some folks suggesting one run cpan under sudo. That used to be necessary to install into the system directory, but modern versions of the CPAN shell allow you to configure it to use sudo just for installing. This is much safer, since it means that tests don't run as root.

If you have an old CPAN shell, simply install the new cpan ("install CPAN") and when you reload the shell, it should prompt you to configure these new directives.

Nowadays, when I'm on a system with an old CPAN, the first thing I do is update the shell and set it up to do this so I can do most of my cpan work as a normal user.

Also, I'd strongly suggest that Windows users investigate strawberry Perl. This is a version of Perl that comes packaged with a pre-configured CPAN shell as well as a compiler. It also includes some hard-to-compile Perl modules with their external C library dependencies, notably XML::Parser. This means that you can do the same thing as every other Perl user when it comes to installing modules, and things tend to "just work" a lot more often.

Lowering answered 15/9, 2008 at 20:8 Comment(2)
install CPAN from where? $sudo apt-get install cpan?Eschalot
@Lao Tzu: no, as CPAN is Perl core module and is not available as separate DEB package. I think in most situations is even better to use App::cpanminus, it is such a joy to use it. Philip Potter suggest it in his answer here and you could try this Chas. Owens answer.Fireguard
V
26

If you're on Ubuntu and you want to install the pre-packaged perl module (for example, geo::ipfree) try this:

    $ apt-cache search perl geo::ipfree
    libgeo-ipfree-perl - A look up country of ip address Perl module

    $ sudo apt-get install libgeo-ipfree-perl
Valerlan answered 15/9, 2008 at 19:21 Comment(1)
apt-cache search perl seems only to work for simple cases (probably only if the search term resembles the debian package name). It fails for e.g. apt-cache search perl DDP --- the correct answer would be libdata-printer-perl.Leta
F
17

A couple of people mentioned the cpan utility, but it's more than just starting a shell. Just give it the modules that you want to install and let it do it's work.

$prompt> cpan Foo::Bar

If you don't give it any arguments it starts the CPAN.pm shell. This works on Unix, Mac, and should be just fine on Windows (especially Strawberry Perl).

There are several other things that you can do with the cpan tool as well. Here's a summary of the current features (which might be newer than the one that comes with CPAN.pm and perl):

-a
Creates the CPAN.pm autobundle with CPAN::Shell->autobundle.

-A module [ module ... ]
Shows the primary maintainers for the specified modules

-C module [ module ... ]
Show the Changes files for the specified modules

-D module [ module ... ]
Show the module details. This prints one line for each out-of-date module (meaning,
modules locally installed but have newer versions on CPAN). Each line has three columns:
module name, local version, and CPAN version.

-L author [ author ... ]
List the modules by the specified authors.

-h
Prints a help message.

-O
Show the out-of-date modules.

-r
Recompiles dynamically loaded modules with CPAN::Shell->recompile.

-v
Print the script version and CPAN.pm version.
Filiation answered 15/9, 2008 at 22:47 Comment(0)
F
15

sudo perl -MCPAN -e 'install Foo'

Flake answered 15/9, 2008 at 19:17 Comment(1)
Brilliant, this worked for me just now on Windows with Git perl, but I had to install GnuWin make firstNawab
H
10

Also see Yes, even you can use CPAN. It shows how you can use CPAN without having root or sudo access.

Hallvard answered 16/9, 2008 at 6:36 Comment(0)
G
9

Already answered and accepted answer - but anyway:

IMHO the easiest way installing CPAN modules (on unix like systems, and have no idea about the wondows) is:

curl -L http://cpanmin.us | perl - --sudo App::cpanminus

The above is installing the "zero configuration CPAN modules installer" called cpanm. (Can take several minutes to install - don't break the process)

and after - simply:

cpanm Foo
cpanm Module::One
cpanm Another::Module
Golf answered 15/9, 2008 at 19:16 Comment(0)
L
8

Otto made a good suggestion. This works for Debian too, as well as any other Debian derivative. The missing piece is what to do when apt-cache search doesn't find something.

$ sudo apt-get install dh-make-perl build-essential apt-file
$ sudo apt-file update

Then whenever you have a random module you wish to install:

$ cd ~/some/path
$ dh-make-perl --build --cpan Some::Random::Module
$ sudo dpkg -i libsome-random-module-perl-0.01-1_i386.deb

This will give you a deb package that you can install to get Some::Random::Module. One of the big benefits here is man pages and sample scripts in addition to the module itself will be placed in your distro's location of choice. If the distro ever comes out with an official package for a newer version of Some::Random::Module, it will automatically be installed when you apt-get upgrade.

Lynx answered 16/9, 2008 at 19:25 Comment(0)
L
6

Use cpan command as cpan Modulename

$ cpan HTML::Parser

To install dependencies automatically follow the below

$ perl -MCPAN -e shell
cpan[1]>  o conf prerequisites_policy follow
cpan[2]>  o conf commit
exit

I prefer App::cpanminus, it installs dependencies automatically. Just do

$ cpanm HTML::Parser
Leclair answered 15/9, 2008 at 19:16 Comment(0)
B
6

Many times it does happen that cpan install command fails with the message like "make test had returned bad status, won't install without force"

In that case following is the way to install the module:

perl -MCPAN -e "CPAN::Shell->force(qw(install Foo::Bar));"
Bibulous answered 15/9, 2008 at 19:16 Comment(1)
Unfortunately this yields: Can't locate CPAN.pm in @INC (you may need to install the CPAN module) (@INC contains: /etc/perlBarram
S
6

Lots of recommendation for CPAN.pm, which is great, but if you're using Perl 5.10 then you've also got access to CPANPLUS.pm which is like CPAN.pm but better.

And, of course, it's available on CPAN for people still using older versions of Perl. Why not try:

$ cpan CPANPLUS
Sewellel answered 16/9, 2008 at 15:25 Comment(1)
Heh, that's cute. Use CPAN.pm to replace itself with CPANPLUS. :)Filiation
E
4

Secure solution

Many answers mention the use of the cpan utility (which uses CPAN.pm) without a word on security. By default, CPAN 2.27 and earlier configures urllist to use a http URL (namely, http://www.cpan.org/), which allows MITM attacks, thus is insecure. This is what is used to download the CHECKSUMS files, so that it needs to be changed to a secure URL (e.g. https://www.cpan.org/).

So, after running cpan and accepting the default configuration, you need to modify the generated MyConfig.pm file (the full path is output) in the following way. Replace

'urllist' => [q[http://www.cpan.org/]],

by

'urllist' => [q[https://www.cpan.org/]],

Note: https is not sufficient; you also need a web site you can trust. So, be careful if you want to choose some arbitrary mirror.

Then you can use cpan in the usual way.

My bug report on rt.cpan.org about the insecure URL.

Enenstein answered 15/9, 2008 at 19:16 Comment(2)
Does "cpan.org" not get redirected to "cpan.org"?Holston
@DaveEveritt The redirection from http to https is useful only for privacy, e.g. against someone who can only look at the data transiting on the network. But if an attacker controls the network (e.g. a public wifi hotspot or some not protected local network), a man-in-the-middle attack may be possible, and the attacker will use his own server (obviously not https://www.cpan.org/).Enenstein
F
4

On Fedora Linux or Enterprise Linux, yum also tracks perl library dependencies. So, if the perl module is available, and some rpm package exports that dependency, it will install the right package for you.

yum install 'perl(Chocolate::Belgian)'

(most likely perl-Chocolate-Belgian package, or even ChocolateFactory package)

Frontispiece answered 15/9, 2008 at 19:16 Comment(0)
S
4

On ubuntu most perl modules are already packaged, so installing is much faster than most other systems which have to compile.

To install Foo::Bar at a commmand prompt for example usually you just do:

sudo apt-get install libfoo-bar-perl

Sadly not all modules follow that naming convention.

Subtorrid answered 15/9, 2008 at 19:16 Comment(0)
H
4

Even it should work:

cpan -i module_name
Holotype answered 15/9, 2008 at 19:16 Comment(0)
C
3

Easiest way for me is this:

PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install DateTime::TimeZone'

a) automatic recursive dependency detection/resolving/installing

b) it's a shell onliner, good for setup-scripts

Corespondent answered 15/9, 2008 at 19:16 Comment(0)
J
3

On Fedora you can use

# yum install foo

as long as Fedora has an existing package for the module.

Jarrell answered 15/9, 2008 at 19:16 Comment(0)
C
3

2 ways that I know of :

USING PPM :

With Windows (ActivePerl) I've used ppm

from the command line type ppm. At the ppm prompt ...

ppm> install foo

or

ppm> search foo

to get a list of foo modules available. Type help for all the commands

USING CPAN :

you can also use CPAN like this (*nix systems) :

perl -MCPAN -e 'shell'

gets you a prompt

cpan>

at the prompt ...

cpan> install foo  (again to install the foo module)

type h to get a list of commands for cpan

Cinderellacindi answered 15/9, 2008 at 19:27 Comment(1)
You can also just say "$ cpan Foo::Bar" to install directly from the command line. No fancy one-liner or CPAN shell necessary. :)Filiation
C
2

Sometimes you can use the yum search foo to search the relative perl module, then use yum install xxx to install.

Coachwork answered 15/9, 2008 at 19:16 Comment(0)
B
2

If you want to put the new module into a custom location that your cpan shell isn't configured to use, then perhaps, the following will be handy.

 #wget <URL to the module.tgz>
 ##unpack
 perl Build.PL
./Build destdir=$HOME install_base=$HOME
./Build destdir=$HOME install_base=$HOME install
Bordello answered 15/9, 2008 at 19:16 Comment(0)
S
1

Seems like you've already got your answer but I figured I'd chime in. This is what I do in some scripts on an Ubuntu (or debian server)

#!/usr/bin/perl

use warnings;
use strict;

#I've gotten into the habit of setting this on all my scripts, prevents weird path issues if the script is not being run by root
$ENV{'PATH'} = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin';

#Fill this with the perl modules required for your project
my @perl = qw(LWP::Simple XML::LibXML MIME::Lite DBI DateTime Config::Tiny Proc::ProcessTable);

chomp(my $curl = `which curl`);

if(!$curl){ system('apt-get install curl -y > /dev/null'); }

chomp(my $cpanm = system('/bin/bash', '-c', 'which cpanm &>/dev/null'));

#installs cpanm if missing
if($cpanm){ system('curl -s -L http://cpanmin.us | perl - --sudo App::cpanminus'); }

#loops through required modules and installs them if missing
foreach my $x (@perl){
    eval "use $x";
    if($@){
        system("cpanm $x");
        eval "use $x";
    }
}

This works well for me, maybe there is something here you can use.

Salesperson answered 15/9, 2008 at 19:16 Comment(0)
M
1

Simply executing cpan Foo::Bar on shell would serve the purpose.

Milline answered 15/9, 2008 at 19:16 Comment(0)
A
0

On Windows with the ActiveState distribution of Perl, use the ppm command.

Annabellannabella answered 15/9, 2008 at 19:26 Comment(1)
Activestate Perl as of 2021 uses its state tool. The PPM stuff is gone: activestate.com/products/perl/ppm-perl-modulesFiliation

© 2022 - 2024 — McMap. All rights reserved.