今天又有小伙伴微信问我perl模块安装的问题,因为ENSEMBL发布的大多数数据库以及软件都是基于perl的,尤其是分量很重的VEP,所以即使你再如何如何的讨厌perl,也不得不与之打交道。
这种细节问题问我,我当然无法直接给出答案咯。毕竟,我的知识积累都不是靠死记硬背的。所以需要取回过头查看一下我的博客,才意识到,我竟然已经写了7篇教程,关于perl的模块。目录如下:
- ubuntu服务器解决方案第七讲-perl安装模块
- Perl用cpan在linux上面安装模块
- Perl及R及python模块碎碎念
- perl模块终极解决方案-上
- perl模块终极解决方案-下
- perl程序技巧-检验系统环境或模块安装
首先需要自己确定已经安装了哪些模块,都安装在哪里?还有新的模块需要安装到哪里? 然后再学习如何安装新的模块。
装Perl模块有两种方法
- 自动安装 (使用CPAN模块自动完成下载、编译、安装的全过程)
- 手工安装 (去CPAN网站下载所需要的模块,手工编译、安装)
使用CPAN模块自动安装
安装前需要先联上网,有无root权限均可。
初次运行CPAN时需要做一些设置,运行下面的命令即可:
代码语言:javascript复制perl -MCPAN -e shell
如果你的机器是直接与因特网相联(拨号上网、专线,etc.),那么一路回车就行了,只需要在最后一步选一个离您最近的 CPAN 镜像站点。例如我选的是位于国内的http://www.cnblogs.com/itech/admin/ftp://www.perl87.cn/CPAN/ 如果你的机器位于防火墙之后,还需要设置ftp代理或http代理。
其实大部分人的机器都不需要走这一步的,肯定是用过了perl的cpan功能啦,除非你是新买的电脑。
代码语言:javascript复制下面是常用 cpan 命令。
cpan>helpcpan>mcpan>install Net::Servercpan>quit
我简单解释一下吧:
代码语言:javascript复制查询:cpan[1]> d /模块名字或者部分名字/查询结果中会给出所有含有模块名字或者部分名字的模块,选择您所需要的模块进行下载下载安装:cpan[1]> install 模块名字同时会自动安装很多依赖的模块,非常方便。
手工安装的步骤:
一般情况下不推荐这种安装方式,但是总是会有迫不得已的时候,而且尝试这种方式,能加深对perl模块的理解。
比如从 CPAN下载了Net-Server模块0.97版的压缩文件Net-Server-0.97.tar.gz,假设放在/usr/local/src/下。
代码语言:javascript复制cd /usr/local/srctar xvzf Net-Server-0.97.tar.gzcd Net-Server-0.97perl Makefile.PLmake test
如果测试结果报告all test ok,你就可以放心地安装编译好的模块了。 安装模块前,先要确保你对你下载包的文件夹(例子里面是/usr/local/src/)有可写权限(通常以 su 命令获得). 当然,只有root用户才会/usr/local/src/有写入的权限,普通用户把模块文件下载到自己的文件夹即可。
测试自己的模块安装成功与否,用下面的命令,如果没有给出任何输出,那就没问题。
代码语言:javascript复制perl -MNet::Server -e1
上述步骤适合于 Linux/Unix下绝大多数的Perl模块。可能还有少数模块的安装方法略有差别,所以最好先看看安装目录里的 README 或 INSTALL。
有的时候如果是build.pl的需要以下安装步骤:(需要Module::Build模块支持)
代码语言:javascript复制perl Build.PL./Build./Build test./Build install
cpan和root权限的关系
前面我说过,是否有root权限,都可以调用cpan下载器的,但还是有些微区别的。
如果是root用户,模块其实没有问题,直接用cpan下载器,几乎能解决所有的模块下载安装问题!
但是如果是非root用户,那么就麻烦了,很难用自动的cpan下载器,总有一些模块用cpan下载失败。
这样只能下载模块源码,然后编译,但是编译有个问题,很多模块居然是依赖于其它模块的,你的不停地下载其它依赖模块,最后才能解决,特别麻烦! 但是我仍然不推荐大家用手工下载的方式安装perl模块。 这里我推荐所有的非root用户运行下面的代码获取自己的私人cpan下载器。
代码语言:javascript复制wget -O- http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::libeval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profileecho 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile
就能拥有一个私人的cpan下载器,~/.profile可能需要更改为.bash_profile, .bashrc, etc等等,取决于你的linux系统! 然后你直接运行cpanm Module::Name,就跟root用户一样的可以下载模块啦! 或者用下面的方式在shell里面安装模块,其中ext是模块的安装目录,可以修改!
代码语言:javascript复制perl -MTime::HiRes -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext Time::HiRes;perl -MFile::Path -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext File::Path;perl -MFile::Basename -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext File::Basename;perl -MFile::Copy -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext File::Copy;perl -MIO::Handle -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext IO::Handle;perl -MYAML::XS -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext YAML::XS;perl -MYAML -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext YAML;perl -MXML::Simple -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext XML::Simple;perl -MStorable -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext Storable;perl -MStatistics::Descriptive -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext Statistics::Descriptive;perl -MTie::IxHash -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext Tie::IxHash;perl -MAlgorithm::Combinatorics -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext Algorithm::Combinatorics;perl -MDevel::Size -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext Devel::Size;perl -MSort::Key::Radix -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext Sort::Key::Radix;perl -MSort::Key -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext Sort::Key;perl -MBit::Vector -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext Bit::Vector;perl -M"feature 'switch'" -e 1 > /dev/null 2>&1 || cpanm -v --notest -l ext feature;
非root用户的另一个解决方案
手动下载local::lib, 这个perl模块,然后自己安装在指定目录,也是能解决模块的问题!
下载之后解压,进入:
代码语言:javascript复制perl Makefile.PL --bootstrap=~/.perl ##这里设置你想把模块放置的目录make test && make installecho 'eval $(perl -I$HOME/.perl/lib/perl5 -Mlocal::lib=$HOME/.perl)' >> ~/.bashrc
等待几个小时即可!!!
添加好环境变量之后,就可以用
代码语言:javascript复制perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)'
这样的模式下载模块了,所有的模块都会存储在$HOME/.perl/lib/perl5 里面!!! 如果是新写的perl程序,需要在开头加入 use local::lib; 这样才能sets up a local lib at ~/perl5,才能使用该模块!
当然每次写程序添加这个也实在是太麻烦了,其实你也可以直接打开 ~/.bashrc,然后写入下面的内容
代码语言:javascript复制PERL5LIB=$PERL5LIB:/PATH_WHERE_YOU_PUT_THE_PACKAGE/source/bin/perl_module; #(笨蛋,这个里面的内容-路径-是需要你修改的,别直接拷贝粘贴哈)export PERL5LIB
可以把perl模块安装在任何地方,然后通过这种方式去把模块加载到你的perl程序!
代码语言:javascript复制PATH="/home/jmzeng/perl5/bin${PATH: :${PATH}}"; export PATH;PERL5LIB="/home/jmzeng/perl5/lib/perl5${PERL5LIB: :${PERL5LIB}}"; export PERL5LIB;PERL_LOCAL_LIB_ROOT="/home/jmzeng/perl5${PERL_LOCAL_LIB_ROOT: :${PERL_LOCAL_LIB_ROOT}}"; export PERL_LOCAL_LIB_ROOT;PERL_MB_OPT="--install_base "/home/jmzeng/perl5""; export PERL_MB_OPT;PERL_MM_OPT="INSTALL_BASE=/home/jmzeng/perl5"; export PERL_MM_OPT;
查看perl模块的安装目录
这里指的是查看那些被添加到了环境变量的perl模块安装目录,理论上你可以在如何文件夹里面安装一个perl模块,但是如果不添加到环境变量,意义不大,因为大多数perl程序只会在环境变量里面搜索安装的perl模块,其它地方的模块它们无法调用。
主要就是@INC这个默认变量 ,可以用下面的代码查看:
代码语言:javascript复制perl -e '{print "$_n" foreach @INC}'
比如我其中一个服务器显示如下:
代码语言:javascript复制/home/jmzeng/perl5/lib/perl5/5.18.2/x86_64-linux-gnu-thread-multi/home/jmzeng/perl5/lib/perl5/5.18.2/home/jmzeng/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/home/jmzeng/perl5/lib/perl5/etc/perl/usr/local/lib/perl/5.18.2/usr/local/share/perl/5.18.2/usr/lib/perl5/usr/share/perl5/usr/lib/perl/5.18/usr/share/perl/5.18/home/jmzeng/perl5/lib/perl5/5.18.1/usr/local/lib/site_perl
查看已经安装哪些perl模块
不管你有没有root权限,进入 cpan 然后install ExtUtils::Installed模块 这样就可以执行 instmodsh 这个命令了,可以查看当前环境下所有的模块! 为什么可以直接使用呢,因为模块安装的时候就顺便把instmodsh给你添加到了环境变量,你可以用 which instmodsh 查看它被安装到哪里了。
代码语言:javascript复制/usr/bin/instmodsh/home/jmzeng/perl5/bin/instmodsh
当然也可以写出脚本来利用这个模块查询其它模块安装信息,主要是写脚本校验用户电脑模块的时候用得着。
代码语言:javascript复制#!/usr/bin/perluse strict;use ExtUtils::Installed;my $inst= ExtUtils::Installed->new();my @modules = $inst->modules();foreach(@modules){ my $ver = $inst->version($_) || "???"; printf("%-12s -- %sn", $_, $ver);}exit 0;
模块理论上可以安装到如何地方
比如非root用户,使用 cpan ,那么一般会创建/home/yourname/.cpan这个隐藏目录下面存储个人的perl模块。 因为不是root用户,所以cpan并不是万能的,有些包是安装不成功的,比如GD模块 而且也可以直接下载模块文件,自己编译到任何目录,只需要在运行自己的脚本的时候加上下面一句话。
代码语言:javascript复制use lib '/home/your-home/perl_lib';
但是,大部分情况下,我们安装模块不是因为我们自己写脚本需要,而且一些生物信息学软件对模块有依赖,但是我们很少有能力修改那些生物信息学软件。 所以这条路一般是不走的。 如果有很多自己下载的包,统一安装到了一个目录,就可以把该目录添加目录到@INC。