首页 / 知识

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

2023-04-15 12:58:00

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

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

我收到此错误:

Can't locate Foo.pm in @INC

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


在Unix上:

通常,您在外壳中启动cpan:

# cpan

和类型

install Chocolate::Belgian

或简称:

cpan Chocolate::Belgian

在Windows上:

If you're using ActivePerl on Windows, the PPM (Perl Package Manager) has much of the same functionality as 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)。


试试App :: cpanminus:

1
# cpanm Chocolate::Belgian

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

1
# cpan App::cpanminus

安装它。

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

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

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


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

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

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

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


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

1
2
3
4
    $ 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


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

1
$prompt> cpan Foo::Bar

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

您还可以使用cpan工具执行其他几项操作。以下是当前功能的摘要(可能比CPAN.pm和perl随附的功能更新):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-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.

sudo perl -MCPAN -e 'install Foo'


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


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

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

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

1
2
3
$ 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升级时会自动安装该发行版。


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

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

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

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

和之后-简单地:

1
2
3
cpanm Foo
cpanm Module::One
cpanm Another::Module


CPAN.pm的很多建议都很棒,但是如果您使用的是Perl 5.10,那么您还可以访问CPANPLUS.pm,这与CPAN.pm类似,但更好。

而且,当然,对于仍在使用旧版本Perl的用户,它可以在CPAN上使用。为什么不尝试:

1
$ cpan CPANPLUS

很多时候确实发生了cpan install命令失败并显示以下消息
"使测试返回不良状态,如果没有用力就无法安装"

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

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

即使它应该工作:

1
cpan -i module_name

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

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

1
sudo apt-get install libfoo-bar-perl

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


使用cpan命令作为cpan Modulename

1
$ cpan HTML::Parser

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

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

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

1
$ cpanm HTML::Parser


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

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

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

b)这是一个shell在线用户,适合安装脚本


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

1
yum install 'perl(Chocolate::Belgian)'

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


我知道的2种方式:

使用PPM:

在Windows(ActivePerl)中,我使用了ppm

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

1
ppm> install foo

要么

1
ppm> search foo

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

使用CPAN:

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

1
perl -MCPAN -e 'shell'

提示您

1
cpan>

在提示符下...

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

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


在Fedora上,您可以使用

1
# yum install foo

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


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

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


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


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


只需在shell上执行cpan Foo::Bar即可达到目的。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/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";
    }
}

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


模块方法安装安装方法

最新内容

相关内容

猜你喜欢