也许这是一个愚蠢的问题?如果我安装一个模块,比如File
使用
cpanm File
它会安装下的所有东西File
,比如File:Listing
等吗?
这不是一个愚蠢的问题,我能理解你为什么不想尝试一下。
但你可以继续做
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
socpanm
将首先确保所有这些模块的依赖关系都得到满足并在相同的基础上递归地继续。
请注意,尝试使用该命令可能很有用,该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 的File-Listing
分布
cpan> d GAAS/File-Listing-6.04.tar.gz
我被告知该发行版的成员模块(“CONTAINSMODS”)等等
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
它更快速、更精确地用于一般用途。
当您请求安装模块时,CPAN 客户端(例如 cpanm)将检查索引以找出哪个存档(即可能是 .tar.gz 文件,但可能是 .tar.bz2 或 .zip)包含最新的授权版本该模块的。
然后,客户端将下载该存档,并运行其中的安装脚本,它可能确实不仅安装了您请求的模块,还安装了其他捆绑的模块。(尽管 CPAN 上的大量档案每个都只包含一个模块。)
在此过程中,客户端还可能会检测到您正在安装的内容具有也需要安装的依赖项,并自动将它们添加到要安装的队列中。
模块的名称不相关。如果你 install Foo
,你不会Foo::Bar
因为它有一个相似的名字而自动得到。如果Foo::Bar
它与Foo
.
CPAN 没有您想象的分层组织——仅仅因为Foo
存在和Foo::Bar
存在并不意味着它在有意义的意义上Foo::Bar
是“下” 。Foo
可能是,但在许多情况下并非如此。Net::SSH::Perl
不属于Net::SSH
; 并且IO::Async
绝对不是IO
.
正如 tobyink 和 Borodin 很好地解释的那样,Perl 模块是“发行版”的一部分,它们是上传到 CPAN 的包文件。当您要求安装一个模块时,CPAN 客户端将安装包含该模块的发行版,以及该发行版依赖于构建或运行的任何发行版。