217

我收到此错误:

Can't locate Foo.pm in @INC

有没有比下载、解压、制作等更简单的安装方法?

4

24 答案 24

254

在 Unix 上

通常你在你的 shell 中启动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)。

于 2008-09-15T19:17:52.553 回答
68

试试App::cpanminus

# cpanm Chocolate::Belgian

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

# cpan App::cpanminus

安装它。

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

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

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

于 2010-08-28T08:34:48.363 回答
29

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

如果您有旧的 CPAN shell,只需安装新的 cpan(“安装 CPAN”),当您重新加载 shell 时,它会提示您配置这些新指令。

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

另外,我强烈建议 Windows 用户研究草莓 Perl。这是一个 Perl 版本,它带有一个预配置的 CPAN shell 和一个编译器。它还包括一些难以编译的 Perl 模块及其外部 C 库依赖项,尤其是 XML::Parser。这意味着在安装模块时,您可以像所有其他 Perl 用户一样做同样的事情,而且事情往往更频繁地“正常工作”。

于 2008-09-15T20:08:08.177 回答
26

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

    $ apt-cache search perl geo::ipfree
    libgeo-ipfree-perl - IP 地址 Perl 模块的查找国家/地区

    $ sudo apt-get install libgeo-ipfree-perl
于 2008-09-15T19:21:23.950 回答
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.
于 2008-09-15T22:47:11.740 回答
12

sudo perl -MCPAN -e 'install Foo'

于 2008-09-15T19:17:11.370 回答
10

另请参阅是的,即使您可以使用 CPAN。它展示了如何在没有 root 或 sudo 访问权限的情况下使用 CPAN。

于 2008-09-16T06:36:04.810 回答
8

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

$ 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 升级时自动安装。

于 2008-09-16T19:25:35.493 回答
7

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

恕我直言,安装 CPAN 模块的最简单方法(在类似 unix 的系统上,并且不知道这些奇迹)是:

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

以上是安装“零配置 CPAN 模块安装程序”,名为cpanm. (可能需要几分钟才能安装 - 不要中断该过程)

之后 - 简单地说:

cpanm Foo
cpanm Module::One
cpanm Another::Module
于 2011-05-22T18:19:38.007 回答
6

很多推荐CPAN.pm,这很棒,但如果你正在使用,Perl 5.10那么你也可以访问CPANPLUS.pm类似CPAN.pm但更好的。

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

$ cpan CPANPLUS
于 2008-09-16T15:25:57.220 回答
5

很多时候确实会发生 cpan install 命令失败并显示 “make test has returned bad status, won't install without force”之类的消息

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

perl -MCPAN -e "CPAN::Shell->force(qw(install Foo::Bar));"
于 2012-11-10T02:24:59.020 回答
5

使用 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
于 2014-05-14T05:38:57.013 回答
4

即使它应该工作:

cpan -i module_name
于 2011-05-22T15:55:25.263 回答
4

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

Foo::Bar例如,要在命令提示符下安装,通常您只需执行以下操作:

sudo apt-get install libfoo-bar-perl

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

于 2013-02-22T13:02:57.177 回答
4

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

yum install 'perl(Chocolate::Belgian)'

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

于 2014-10-30T10:39:32.430 回答
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 的命令列表

于 2008-09-15T19:27:42.453 回答
3

在 Fedora 上,您可以使用

# yum install foo

只要 Fedora 有该模块的现有软件包。

于 2008-11-21T19:59:27.450 回答
3

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

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

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

b) 它是一个 shell onlineer,适用于 setup-scripts

于 2016-12-28T11:16:18.100 回答
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
于 2013-09-11T18:06:06.097 回答
2

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

于 2014-05-20T08:14:12.000 回答
2

安全解决方案

许多答案都提到了cpan实用程序(使用CPAN.pm)的使用,而没有提及安全性。默认情况下,CPAN2.27 及更早版本配置urllist为使用 http URL(即http://www.cpan.org/),它允许 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 上关于不安全 URL 的错误报告。

于 2019-10-25T13:17:35.830 回答
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";
    }
}

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

于 2016-11-04T15:26:15.397 回答
0

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

于 2008-09-15T19:26:21.113 回答
0

简单地cpan Foo::Bar在 shell 上执行就可以达到目的。

于 2015-10-01T09:56:36.833 回答