安装缺少的Perl模块的最简单方法是什么?


192

我收到此错误:

Can't locate Foo.pm in @INC

是否有比下载,解压缩,制作等更简单的安装方法?


1
如果有问题的模块是核心模块,请查阅如何修复“无法找到Archive / Tar.pm”
ikegami

请特别注意安全性:必须从受信任的站点以安全的方式下载确保未修改模块所需的内容。请参阅有关的使用的答案cpan
vinc17

Answers:


226

在Unix上

通常,您在外壳中启动cpan

# cpan

和类型

install Chocolate::Belgian

或简称:

cpan Chocolate::Belgian

在Windows上

如果在Windows上使用ActivePerl,则PPM(Perl软件包管理器)具有与CPAN.pm相同的功能。

例:

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

请参阅如何安装Perl模块?在CPAN常见问题解答中

许多发行版都将许多perl模块作为软件包提供。

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

您应该始终喜欢它们,因为您会从自动(安全)更新删除的便利中受益。使用cpan可能非常棘手工具本身。

对于Gentoo,有一个名为g-cpan的好工具,它可以从CPAN生成/安装模块,并为您创建一个Gentoo软件包(ebuild)。


14
简短的形式只是从命令行:“ cpan Chocolate :: Belgian” :)
brian d foy

3
IIRC最新的ActivePerl不再具有命令行ppm,它现在打开一个精美的GUI。
凯夫

6
只需“ ppm”即可打开GUI,但是紧随其后的是命令,它们保留在命令行中。因此,“ ppm帮助”,“ ppm安装...”等
Bill Ruppert 2012年

请注意,ppm为模块路径分隔符使用破折号,而不是通常的双冒号。(也许是因为冒号的意思是做事吗?)–我已经经历了好几次;)
马修·洛克

3
@MatthewLock:ppm使用连字符-,因为您指定的分布要安装,这是一个很大的诚实。举例来说,如果使用cpan安装LWPLWP::SimpleLWP::UserAgent将安装分布libwww-perl为您服务。大多数分布包含具有等效名称的单个模块,但有几个例外那样
鲍罗廷

65

试试App :: cpanminus

# cpanm Chocolate::Belgian

仅安装东西非常好。它不提供CPAN或CPANPLUS的更复杂的功能,因此只要您知道要安装哪个模块,它就易于使用。如果您还没有cpanminus,只需键入:

# cpan App::cpanminus

安装它。

也可以完全不使用cpan进行安装。基本的引导程序是,

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

有关更多信息,请转到App :: cpanminus页面并查看有关安装的部分。


7
使用cpan安装App::cpanminus有点奇怪。正常的安装说明涉及一个引导过程,该过程是从cpanmin.us下载其中的一部分,然后使用该过程来安装其余部分。这避免cpan了(随后)无用.cpan目录的配置和创建。
Chas。欧文斯(Owens)

在Ubuntu上,您可以仅从cpanminus终端安装。我发现cpanmcpan它更好,因为它不会在屏幕上显示错误日志,而是将它们存储在临时日志文件中,并在出现错误时提供路径。
user13107'9

我在尝试您的命令时遇到此错误:在@INC中找不到strict.pm(您可能需要安装strict模块)(@ INC包含:/ etc / perl
IgorGanapolsky

29

我注意到有些人建议在sudo下运行cpan。这曾经是安装到系统目录中所必需的,但是现代版本的CPAN Shell允许您将其配置为使用sudo进行安装。这更安全,因为这意味着测试不会以root身份运行。

如果您使用的是旧的CPAN外壳,只需安装新的cpan(“安装CPAN”),然后在重新加载外壳时,它会提示您配置这些新指令。

如今,当我在具有旧CPAN的系统上时,我要做的第一件事就是更新shell并将其设置为执行此操作,以便我可以以普通用户的身份完成大部分cpan工作。

另外,我强烈建议Windows用户调查Strawberry Perl。这是Perl的版本,它随附有预配置的CPAN Shell和编译器。它还包括一些难以编译的Perl模块,这些模块具有外部C库依赖性,尤其是XML :: Parser。这意味着,在安装模块时,您可以与其他Perl用户一起执行相同的操作,而且事情往往“更容易执行”。


1
install CPAN来自哪里?$sudo apt-get install cpan
同构

1
@Lao Tzu:否,因为CPAN是Perl核心模块,不能作为单独的DEB软件包使用。我认为在大多数情况下使用效果更好,使用App::cpanminus它是一种乐趣。菲利普·波特(Philip Potter)在这里的回答中建议了这一点,您可以尝试这款Chas。欧文斯回答
wk

25

如果您使用的是Ubuntu,并且要安装预打包的perl模块(例如geo :: ipfree),请尝试以下操作:

    $ apt-cache搜索perl geo :: ipfree
    libgeo-ipfree-perl-IP地址Perl模块的查询国家

    $ sudo apt-get install libgeo-ipfree-perl

这很棒。谢谢。
伊万X

16

几个人提到了cpan实用程序,但它不仅仅是启动shell。只需为其提供要安装的模块,然后使其工作即可。

$prompt> cpan Foo::Bar

如果不提供任何参数,它将启动CPAN.pm shell。这可以在Unix,Mac上运行,并且在Windows(尤其是Strawberry Perl)上也可以。

您还可以使用cpan工具执行其他几项操作。以下是当前功能的摘要(可能比CPAN.pm和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.

11

sudo perl -MCPAN -e 'install Foo'


太棒了,这在Windows上使用Git perl才对我有效,但是我必须先安装GnuWin make
wytten


8

奥托提出了一个很好的建议。这也适用于Debian以及任何其他Debian衍生产品。缺少的部分是当apt-cache搜索找不到任何东西时该怎么办。

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

然后,只要您有一个随机模块,都希望安装:

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

这将为您提供一个deb软件包,您可以安装它来获取Some :: Random :: Module。这里最大的好处之一是手册页和示例脚本以及模块本身将被放置在您发行版的选择位置。如果发行版随附某个官方版本的Some :: Random :: Module的较新版本的官方软件包,则在您进行apt-get升级时会自动安装该发行版。


7

已经回答并接受了答案-但无论如何:

恕我直言,安装CPAN模块的最简单方法(在类似Unix的系统上,并且完全不了解这些信息)是:

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

上面是安装名为的“零配置CPAN模块安装程序” cpanm。(可能需要花费几分钟才能安装-请勿中断此过程)

和之后-简单地:

cpanm Foo
cpanm Module::One
cpanm Another::Module

6

有很多关于的建议CPAN.pm,这很不错,但是如果您使用的是,Perl 5.10那么您也可以访问CPANPLUS.pm其中的类似CPAN.pm但更好的方法。

当然,它CPAN仍然适用于仍在使用旧版本Perl的人们。为什么不尝试:

$ cpan CPANPLUS

嘿,好可爱。使用CPAN.pm将自己替换为CPANPLUS。:)
brian d foy

5

很多时候,确实发生了cpan install命令失败,并显示诸如 “使测试返回错误状态,如果没有强行就无法安装”的消息

在这种情况下,以下是安装模块的方法:

perl -MCPAN -e "CPAN::Shell->force(qw(install Foo::Bar));"

不幸的是,这样会产生:无法在@INC中找到CPAN.pm(您可能需要安装CPAN模块)(@ INC包含:/ etc / perl
IgorGanapolsky

4

在ubuntu上,大多数perl模块已经打包,因此安装比大多数其他必须编译的系统要快得多。

Foo::Bar例如,通常要在命令提示符下安装:

sudo apt-get install libfoo-bar-perl

遗憾的是,并非所有模块都遵循该命名约定。



4

使用cpan命令作为 cpan Modulename

$ cpan HTML::Parser

要自动安装依赖项,请执行以下操作

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

我更喜欢App :: cpanminus,它会自动安装依赖项。做就是了

$ cpanm HTML::Parser

3

我知道的2种方式:

使用PPM:

Windows(ActivePerl)中,我使用了ppm

从命令行键入ppm。在ppm提示下...

ppm> install foo

要么

ppm> search foo

获取可用的foo模块列表。类型帮助的所有命令

使用CPAN:

您也可以像这样使用CPAN(* nix系统):

perl -MCPAN -e 'shell'

提示您

cpan>

在提示符下...

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

键入h以获取cpan的命令列表


1
您也可以只说“ $ cpan Foo :: Bar”直接从命令行安装。无需花哨的单衬管或CPAN外壳。:)
brian d foy


3

Fedora Linux或上Enterprise Linuxyum还跟踪perl库依赖关系。因此,如果perl模块可用,并且某些rpm软件包导出了该依赖关系,它将为您安装正确的软件包。

yum install 'perl(Chocolate::Belgian)'

(很有可能是perl-Chocolate-Belgian软件包,甚至ChocolateFactory软件包)


3

对我来说最简单的方法是:

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

a)自动递归依赖项检测/解决/安装

b)这是一个shell联机程序,适合安装脚本


2

如果要将新模块放置到未配置cpan shell的自定义位置,则可能很方便。

 #wget <URL to the module.tgz>
 ##unpack
 perl Build.PL
./Build destdir=$HOME install_base=$HOME
./Build destdir=$HOME install_base=$HOME install

2

有时,您可以使用yum search foo来搜索相关的perl模块,然后使用yum install xxx进行安装。


2

安全的解决方案

许多答案都提到了该cpan实用程序的使用(使用CPAN.pm),但没有一句安全性。默认情况下,CPAN2.27和更早版本配置urllist为使用http URL(即http://www.cpan.org/),该URL 允许MITM攻击,因此是不安全的。这就是用于下载CHECKSUMS文件的方式,因此需要将其更改为安全的URL(例如https://www.cpan.org/)。

因此,在运行cpan并接受默认配置后,您需要MyConfig.pm按以下方式修改生成的文件(输出完整路径)。更换

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

通过

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

注意:https还不够;您还需要一个可以信任的网站。因此,如果要选择任意镜子,请小心。

然后,您可以cpan按通常的方式使用。

我在rt.cpan.org上关于不安全网址的错误报告


cpan.org ”不会重定向到“ cpan.org ”吗?
Dave Everitt

1
@DaveEveritt从http重定向到https仅对于保护隐私很有用,例如,针对只能查看网络上正在传输的数据的人。但是,如果攻击者控制了网络(例如,公共wifi热点或一些不受保护的本地网络),则可能会发生中间人攻击,并且攻击者将使用自己的服务器(显然不能https://www.cpan.org/)。
vinc17

1

在具有Perl ActiveState发行版的Windows上,使用ppm命令。



1

似乎您已经得到了答案,但是我想我会喜欢的。这就是我在Ubuntu(或Debian服务器)上的某些脚本中所做的事情

#!/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";
    }
}

这对我来说效果很好,也许这里可以使用一些东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.