是否有一种智能方法可以检测系统中是否安装了某个Perl模块? 我的旧sutpid方法是编写一个Perl脚本,其中我唯一要做的就是使用该模块。如果我运行检测脚本时没有任何结果,那么我知道模块已经安装,但我仍然不知道哪个版本以及模块的安装位置。
提前感谢。
答案 0 :(得分:9)
类似的东西:
perl -MModule -e 'print "$Module::VERSION\n"' 2>/dev/null || echo "Not installed"
会给你一个给定模块的版本,或者告诉你它没有安装。用法如下:
perl -MXML::Parser -e 'print "$XML::Parser::VERSION\n"' 2>/dev/null || echo "Not installed"
要查找模块路径,您可以检查@INC
以查找可能的位置,或者您可以查看perlwhich。 pmpath还有pmtools。
答案 1 :(得分:5)
我所知道的最短的事情不涉及脚本或shell别名:
$ perl -MFoo::Bar\ 99
Foo::Bar version 99 required--this is only version 1.234.
(或者如果没有安装,则不在@INC
内的常用消息)
对于好奇,这与perl -e 'use Foo::Bar 99'
相同。
答案 2 :(得分:3)
instmodsh
NAME
instmodsh - A shell to examine installed modules
SYNOPSIS
instmodsh
DESCRIPTION
A little interface to ExtUtils::Installed to examine installed modules, validate your packlists and even create a tarball from an installed module.
SEE ALSO
ExtUtils::Installed
答案 3 :(得分:3)
这是一个执行该操作的程序:
#!/usr/bin/perl
# testmod - test to see if a module is available
use strict;
use warnings;
my $mod = (shift @ARGV) || die "usage: $0 module\n";
# convert module-name to path
my $file = $mod;
$file =~ s{::}{/}gsmx;
$file .= '.pm';
# Pull in the module, if it exists
eval { require $file }
or die "can't find module $mod\n";
# Get the version from the module, if defined
my $ver;
{ no strict 'refs';
$ver = ${$mod . "::VERSION"} || 'UNKNOWN';
}
# And its location
my $from = $INC{$file};
print "module $mod is version $ver loaded from $from\n";
答案 4 :(得分:2)
使用pmvers
。顾名思义,它显示了已安装模块的版本。如果未安装模块,则会因熟悉的错误消息而失败:Can't locate … in @INC (@INC contains: …)
使用同一发行版中的pmpath
查找模块的安装路径。
答案 5 :(得分:1)
我不知道是否有任何聪明的方法。但是我通常会这样 做的是使用perldoc的'-l'或'-m'选项。例如:
%perldoc -l XML::Simple
,输出如下所示,这是模块文件的完整路径
.../lib/XML/Simple.pm
.../lib/XML/Simple.pm
与您的方法相比,这种方法的优点是,如果安装了模块
输出包含模块位置的路径。但是当模块没有时
安装
或者如果它没有perldoc,则显示的错误消息是“找不到...的文档”,
无法区分错误是由于缺少模块还是由于缺失而导致的
文档。在这种情况下,-m选项变得很方便,因为它打印整个
文件的内容以及路径。
答案 6 :(得分:1)
我使用这些bash函数/ Perl oneliners来查找Perl模块的版本号和位置:
# equivalent to perldoc -l <module>
perlwhere() {
perl -wle'eval "require $ARGV[0]" or die; ($mod = $ARGV[0]) =~ s|::|/|g; print $INC{"${mod}.pm"}' $1
}
perlversion() {
perl -M$1 -wle'print $ARGV[0]->VERSION' $1
}
: [ether ~].2$; perlwhere Test::More
/usr/lib/perl5/5.8.8/Test/More.pm
: [ether ~].2$; perlversion Test::More
0.94
答案 7 :(得分:1)
pmvers实用程序和其他pmtools将满足您的需求。否则这里有一个单行程序来查找模块版本:
perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module
答案 8 :(得分:0)
如果您正在寻找跨平台CLI (Linux,OSX,Windows),请考虑我的 whichpm
utility ; e.g:
# Locate the Data::Dumper module, and also print
# version information and core-module status.
$ whichpm -v Data::Dumper
Data::Dumper 2.145 core>=5.005 /usr/lib/perl/5.18/Data/Dumper.pm
它还可以找到意外的重复项并列出所有安装的模块。
如果您碰巧安装了Node.js / io.js,可以从npm注册表安装它:
[sudo] npm install whichpm -g
有关手动安装说明等信息,请参阅the repo;这是latest version的直接下载链接(将保持最新状态。)