使用cpanm安装Perl模块

时间:2014-07-15 21:42:13

标签: perl-module cpan cpanm

也许这是一个愚蠢的问题?如果我使用

安装File之类的模块
cpanm File

是否会安装File下的所有内容,例如File:Listing等?

3 个答案:

答案 0 :(得分:5)

这不是一个愚蠢的问题,我可以理解你为什么不想尝试它。

但你可以继续做

cpanm File
由于没有名为File的模块,所以很少会发生。

CPAN上的模块由分发组织。单个发行版可以包含一个或多个相关模块,因此cpanm首先检查哪个发行版包含您要求的模块并获取它。

检查该分发的依赖关系,如果有任何过期或根本没有安装,那么它将依次获取并安装每个分发。最终要么解决所有依赖关系,要么会出现阻止cpanm继续进行的严重错误。

安装所有依赖项后,可以解压缩并安装包含模块的发行版。

一切顺利,这就是事情的结束,所以简而言之

cpanm File

将不会安装任何内容,因为没有File模块。

cpanm File:Listing

将安装包含File::Listing的分发版,在撰写本文时GAAS/File-Listing-6.04.tar.gz

该分发也恰好包含这些模块

File::Listing::apache
File::Listing::dosftp
File::Listing::netware
File::Listing::unix
File::Listing::vms

因此cpanm将首先确保所有那些模块'依赖性得到满足并在相同的基础上递归递送。


注意,尝试使用cpan命令可能很有用,该命令具有更全面的命令集。最重要的是,它将按名称或正则表达式列出模块,发行版,作者和包。

输入cpan并获取提示

cpan>

什么时候可以要求

cpan> help

,它将列出可用命令的摘要。例如,我可以检查File::Listing模块

cpan> m File::Listing

查看作者,发行版(" CPAN_FILE"),版本等等

Module id = File::Listing
    CPAN_USERID  GAAS (Gisle Aas <gisle@ActiveState.com>)
    CPAN_VERSION 6.04
    CPAN_FILE    G/GA/GAAS/File-Listing-6.04.tar.gz
    UPLOAD_DATE  2012-02-15
    MANPAGE      File::Listing - parse directory listing
    INST_FILE    C:\Strawberry\perl\vendor\lib\File\Listing.pm
    INST_VERSION 6.04

我还可以使用正则表达式

查找名称相似的发行版
cpan> d /File-Listing/

看到有两个匹配的发行版

Distribution    GAAS/File-Listing-6.04.tar.gz
Distribution    PLICEASE/File-Listing-Ftpcopy-0.05.tar.gz
2 items found

我可以看看Gisle Aas&#39;使用

分发File-Listing
cpan> d GAAS/File-Listing-6.04.tar.gz

我被告知该发行版的成员模块(&#34; CONTAINSMODS&#34;)等等

Distribution id = G/GA/GAAS/File-Listing-6.04.tar.gz
    CPAN_USERID  GAAS (Gisle Aas <gisle@ActiveState.com>)
    CPAN_VERSION 6.04
    CONTAINSMODS File::Listing File::Listing::apache File::Listing::dosftp File::Listing::netware File::Listing::unix File::Listing::vms
    UPLOAD_DATE  2012-02-15

cpanm没有此类浏览功能,因此我建议您尝试使用cpan本身并使用md命令一段时间,名称和正则表达式。

一旦了解了CPAN存储库的结构,您就会发现cpanm对于一般用途更加快速和准确。

答案 1 :(得分:1)

当您请求安装模块时,CPAN客户端(例如cpanm)将检查索引以找出哪个存档(即可能是.tar.gz文件,但可能是.tar.bz2或.zip)包含该模块的最新授权版本。

然后客户端将下载该存档,并运行内部找到的安装脚本,这可能确实不仅安装了您请求的模块,还安装了其他捆绑模块。 (尽管CPAN上的大量存档每个只包含一个模块。)

在此过程中,客户端还可能检测到您正在安装的内容还有需要安装的依赖项,并自动将它们添加到要安装的队列中。

模块的名称无关紧要。如果您安装Foo,则不会因为名称相似而自动获取Foo::Bar。如果它与Foo::Bar位于同一档案文件中,您只会自动获得Foo

答案 2 :(得分:1)

CPAN没有像您想象的那样的层级组织 - 仅仅因为Foo存在且Foo::Bar存在并不意味着Foo::Bar在“{{1}下”在一个有意义的意义上。它可能是,但在许多情况下它不是。 Foo不属于Net::SSH::Perl;并且Net::SSH绝对不属于IO::Async

至于tobyink和Borodin已经很好地解释了,Perl模块是“发行版”的一部分,它是上传到CPAN的包文件。当您要求安装模块时,CPAN客户端将安装包含该模块的分发,以及该分发依赖于构建或运行的任何分发。