Perl模块管理
Perl模块管理
perl有自带的模块,还有第三方模块。自带的模块是随perl安装而安装好的,第三方模块需要从CPAN(Comprehensive Perl Archive Network)上下载并安装,可以从https://metacpan.org中查找所需第三方模块。
可以借助perldoc 'MODULE_NAME'
来间接查询一个模块是否已安装,如果安装了就能正常输出对应的文档,如果没有安装,则报错。
如果想要查看所有已安装的module,则使用cpan -a
,不过第一次使用它会要求你先进行一番配置,不过一般来说,选择让它自动配置即可。
例如,筛选出已安装的包含CGI字符的模块。第一个字段是字段名,第二个字段是已安装版本号,第三个字段是可获取的最新版本号,第四个字段是在CPAN中的位置,这个位置,稍后解释。
1 | [root@redisa-b ~]# cpan -a | grep CGI |
全面了解推荐内容:
模块必知常识
模块实际上都是perl脚本。在perl文化中,非常注重模块的开发人员以及维护人员。在每个模块相关的元数据属性中,都会记录他们的信息。
以下是一个模块基本具备的信息:
1 | Module id = File::Utils |
- Module ID:模块ID,也就是模块的名称,即
File::Utils
- CPAN_USERID:上传这个模块的人在CPAN中的ID,后面是它的注册名和邮箱。从邮箱和名称来看,显然这是个中国人
- CPAN_VERSION:这个模块的版本号
- CPAN_FILE:这个模块的完整ID,这个ID称为
Distribution id
。这个ID由4部分组成:- 第3部分是这个模块的上传者ID
- 第1部分是这个上传者ID的第一个字母
- 第2部分是上传者ID的前两个字母 、
- 第4部分是模块的源码包名称
- UPLOAD_DATA:模块的上传时间
- MANPAGE:man文档,可以通过
man File::Utils
获取该模块的帮助信息 - INST_FILE:模块安装路径,如果没有安装该模块,则显示
not installed
- INST_VERSION:已安装的该模块版本号
通过Distribution id,可以直接推断出这个文件的URL。例如,以阿里云的CPAN源镜像(http://mirrors.aliyun.com/CPAN/
)为例,那么这个模块包的URL为:http://mirrors.aliyun.com/CPAN/authors/id/P/PE/PEKINGSAM/File-Utils-0.0.5.tar.gz
。
有些工具需要我们指定Distribution id,4个部分毕竟比较复杂,其实可以指定后两个部分,一般来说可以自动补齐前两部分。
另外,CPAN安装模块时,依赖于make工具,所以必须先安装好make。更简易安装好整个开发包。
1 | yum -y install make |
手动编译安装模块
例如,网上搜索到了Data::Dumper
模块,想要手动安装它。
从网上下载好模块源码包,然后解压,进入源码包目录:
1 | wget https://cpan.metacpan.org/authors/id/X/XS/XSAWYERX/Data-Dumper-2.172.tar.gz |
然后看看这个目录下,存在的文件是Makefile.PL还是Build.PL,这两种文件都可以用来编译安装,如果同时存在,则随便选择一种即可。
1 | [root@redisa-b Data-Dumper-2.172]# ls -l |
上面的是Makefile.PL,所以安装:
1 | perl Makefile.PL |
如果想要指定安装路径,则加上INSTALL_BASE
即可:
1 | perl Makefile.PL INSTALL_BASE=/home/perlapps |
如果是Build.PL,则:
1 | perl Build.PL |
如果想要指定安装路径,则加上perl Build.PL −−install_base /home/perlapps
如果是手动指定的安装路径,还需要设置模块查找路径环境变量:
1 | export PERL5LIB=/home/perlapps |
或者在perl程序内部,指定查找路径:
1 | #!/usr/bin/perl |
手动编译安装时,很可能会因为额外的库依赖问题而导致编译中断。一般来说,对于提示缺少的库文件名$foo
来说,Debian/Ubuntu上对应的库文件包是lib$foo-dev
或$foo-dev
,redhat系列上则是lib$foo-devel
,使用包管理工具大致搜索一下即可。
模块管理工具:交互式的cpan shell
手动安装模块毕竟不方便。perl自身的CPAN模块提供的shell可以让我们快速安装模块。
1 | perl -MCPAN -e "shell" |
它将会进入cpan的交互式shell模式。在这个交互式模式下,可以执行很多操作。例如安装模块、下载模块、按照正则查找模块、查找某个作者的模块、升级模块、列出最近上传到CPAN的模块等等。
cpan下能执行的命令,可以通过h键来获取帮助:
1 | cpan[8]> h |
例如,通过m命令或者i命令按正则表达式查找包含File::Util
字符的模块:
1 | cpan[11]> m /^File::Util*/ |
这里列出来的模块版本可能会比CPAN网页上列出的版本更低一些。
使用过程中,按键可能会非常不好用。如果需要删除某个已键入的字符,需要同时按住ctrl+back按键。
例如,安装File::Util
模块:
1 | cpan[12]> install File::Utils |
还可以安装网上下载的perl模块源码包,甚至get命令可以直接下载源码包。例如,安装File::Rename
模块,它的源码包地址为https://cpan.metacpan.org/authors/id/R/RM/RMBARKER/File-Rename-1.09_02.tar.gz
1 | cpan[8]> get RMBARKER/File-Rename-1.09_02.tar.gz |
下载成功后,它会提示保存的路径:
1 | Checksum for /root/.cpan/sources/authors/id/R/RM/RMBARKER/File-Rename-1.09_02.tar.gz ok |
然后用install命令安装这个模块源码包即可:
1 | cpan[9]> install RMBARKER/File-Rename-1.09_02.tar.gz |
这里的distribution id既可以加上前两部分,也可以省略前两部分。
默认安装一个模块时需要make test
,但是有些模块需要test非常常的时间,比如安装CPANPLUS模块时的依赖模块File::Fetch
,它有可能会test非常长的时间,这时候可以CTRL+C退出,再次安装时跳过test阶段。
1 | cpan[10]> notest install CPANPLUS |
如果想要配置CPAN,需要使用o conf
,这个命令很关键,关于配置的信息非常多,此处只介绍下修改CPAN源的方法。例如修改CPAN的源为阿里云的源:
1 | # 1.指定aliyun的CPAN |
关于cpan交互式,以及o conf
以及CPAN模块的配置文件,可以man CPAN
获取更多用法。
另外注意,在perl程序代码中,可以通过CPAN::Shell->COMMAND(“arguments”);实现和交互式模式下一样的操作:
例如,在perl程序代码中安装模块:
1 | #!/usr/bin/perl |
CPAN客户端:cpan命令(脚本)
cpan命令是随perl一起安装的一个perl脚本,它让我们从cpan那恶心的交互式中解脱出来。但它内部实现的功能主要还是调用CPAN.pm,和cpan交互式是一样的。
大概看几个cpan脚本的常用选项:
1 | -a:创建CPAN.pm的autobundle |
例如,安装File::Util::Manual
模块,很简单了。
1 | cpan -i File::Util::Manual |
查看模块的信息:
1 | [root@redisa-b ~]# cpan -D File::Utils |
cpan -J
对于了解和修改CPAN模块配置文件非常有帮助,可以执行一下试试看。
CPAN客户端:CPANPLUS模块
CPANPLUS提供了和CPAN.pm类似的功能,但特性更丰富。
首先,安装它:
1 | cpan[20]> notest install CPANPLUS |
cpanp命令可以进入交互式,也可以使用命令行模式,命令行模式功能也很丰富。不过用法都很简单,和cpan都类似,可以cpanp -h
大致看一下。
例如,安装MongoDB模块:
1 | cpanp -i MongoDB |
卸载MongoDB模块:
1 | cpanp -u MongoDB |
CPAN客户端:cpanm
这个是真正的完全一键安装,无需任何配置。而且,它没有交互式模式。
首先,安装这个工具所在cpanminus模块。:
1 | install App::cpanminus |
选项和用法很简单,可以cpanm -h
去瞧一瞧。
要安装某个模块:
1 | cpanm File::Utils |
默认情况下,它搜索的CPAN源是http://www.cpan.org/
,可以指定CPAN源:
1 | cpanm --mirrors http://mirrors.aliyun.com/CPAN File::Utils |
卸载模块
要卸载一个模块,可以安装pmuninstall模块,它提供pm-uninstall命令,可以快速卸载模块。
1 | cpan App::pmuninstall |
例如,卸载MongoDB模块:
1 | pm-uninstall MongoDB |
默认会给出提示,是否要确认卸载。可以指定-f
选项强制卸载,无需交互式提示:
1 | pm-uninstall -f MongoDB |
当然,除了pm-uninstall,cpan、cpanp、cpanm都带有卸载的功能。
local::lib
默认情况下,安装的第三方模块都会和perl放在一起,而且对于那些非root用户,对某些目录没有写入权限,导致安装失败,只能sudo。可以使用local::lib
,自定义安装路径。
首先,安装这个模块:
1 | cpan[9]> install local::lib |
然后回到bash,可以查看这个模块导出的环境变量:
1 | $ perl -Mlocal::lib |
local::lib
正是借助于修改某些环境变量(注意其中的PERL5LIB)让它们脱离perl内置路径@INC
,从而影响CPAN客户端安装的目录路径。
然后使用cpan客户端的-I
开关,就表示根据local::lib
的配置来安装(注:有些cpan客户端没有-I选项)。
1 | cpan -I Text::Levenshtein |
如果使用cpanm,它比较聪明一点,如果你已经设置了local::lib
,它会直接按照设定安装,如果没有设定,它会检查对默认的安装目录是否具有写权限,如果没有,就自动设置local::lib
模块。所以,cpanm无需设置local::lib
,但仍然可以显式指明使用local::lib
来安装:
1 | cpanm --local-lib HTML::Parser |
如果仍然使用cpan客户端,指定安装路径。可以修改两个参数:
1 | cpan[1]> o conf makepl_arg INSTALL_BASE=/home/fairy/perl5 |
可以从man CPAN
中获取这两个参数的解释:分别是传递给perl Makefile.PL
和./Build
的参数。也就是说,通过设置这两个参数,无论是makefile格式的安装,还是build格式的安装,都会安装到给定目录下。
CPAN模块的配置文件和配置建议
当我们第一次进入CPAN shell的时候,会让我们配置CPAN,我们可以选择让它自动配置。自动配置后,它会提示配置文件保存到了哪里。
我们也可以在cpan交互式中使用mkmyconfig重新生成属于当前用户的配置文件,它会保存到~/.cpan/CPAN/MyConfig.pm
,同时还会将local::lib
的一些相关环境变量追加到~/.bashrc
中。
进入cpan交互式shell,键入o conf
即可输出当前的配置。内容项很多,有几项是建议修改的:
1.修改CPAN的源为阿里云的源
1 | # 1.指定aliyun的CPAN |
上面的push命令是将aliyun的CPAN源推到urllist的数组最后一个位置(key是urllist,value是一个由url组成的数组),还可以使用pop移除数组最后一个元素,使用shift移除数组第一个元素,使用unshift推到数组的第一个元素。如果不给这几个命令,直接给url,则替换整个数组。
如果想清空urllist,可以使用o conf init urllist
。
2.修改make和build的执行方式,加上sudo。这主要是针对非root用户的
1 | o conf make_install_make_command 'sudo /usr/bin/make' |
3.指定安装路径。这主要是针对非root用户的
1 | cpan[1]> o conf makepl_arg INSTALL_BASE=/home/fairy/perl5 |
4.配置自动提交
1 | o conf auto_commit 1 |
5.配置依赖策略
1 | o conf prerequisites_policy follow |
除了上面几项,使用cpan时,还建议更新和安装以下几个模块:
1 | install CPAN ExtUtils::MakeMaker Module::Build Bundle::CPAN |
安装这几个模块可以解决很多不必要的麻烦。