也许这是一个愚蠢的问题?如果我使用
安装File
之类的模块
cpanm File
是否会安装File
下的所有内容,例如File:Listing
等?
答案 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
本身并使用m
和d
命令一段时间,名称和正则表达式。
一旦了解了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客户端将安装包含该模块的分发,以及该分发依赖于构建或运行的任何分发。