除了尝试
perldoc
单独用于任何CPAN模块,我喜欢或浏览文件系统并查看目录我不知道我们安装了哪些模块.
获得安装的每个CPAN模块的最佳列表的最简单方法是什么?从命令行或其他方式.
这可以在Perl FAQ中找到,答案可以很快找到perldoc -q installed
.简而言之,它归结为使用ExtUtils::Installed
或使用File::Find
,这两个变体已经在本主题中已经介绍过了.
您还可以找到FAQ条目"如何找到我的系统上安装的模块?" 在perlfaq3.您可以通过查看perlfaq查看所有常见问题解答答案的列表
perldoc perllocal
编辑:在CPAN FAQ中有关于它的更多信息
perldoc -q installed
声称cpan -l
会做的伎俩,但它不适合我.另一种选择:
cpan -a
确实吐出了一个很好的已安装软件包列表,并且具有将它们写入文件的良好副作用.
值得注意的是,perldoc perllocal只会报告通过CPAN安装的模块.如果有人手动安装模块,则无法找到它们.此外,如果您有多个人安装模块并且perllocal.pod受源代码管理,那么人们可能会错误地解决冲突并破坏列表(例如,这在工作中已经发生).
令人遗憾的是,解决方案似乎是通过File :: Find或类似的东西走过@INC.但是,这不只是找到模块,它还在分布中找到相关模块.例如,除了Test :: Harness的实际分发名称之外,它还会报告TAP :: Harness和TAP :: Parser(假设您有版本3或更高版本).您可能会将它们与分发名称进行匹配,并丢弃那些不匹配的名称,但随后您可能会丢弃本地构建和安装的模块.
我相信brian d foy的backpan索引工作应该有代码将它传递给.pm文件并且它会尝试推断分发,但即使这有时也会失败,因为包中的内容不一定是安装的(参见Devel :: Cover :: Inc为例).
您可以尝试ExtUtils-Installed,但只能查看.packlist
s,因此它可能会错过人们@INC
手动移动的模块.
我为一个朋友写了一个App-Module-Lister,他想把这个作为非shell网络托管账户的CGI脚本.您可以简单地获取模块文件并将其作为文件名上传,服务器将其视为CGI脚本.它没有标准库之外的依赖项.按原样使用或窃取代码.
它输出模块及其版本的列表:
Tie::Cycle 1.15 Tie::IxHash 1.21 Tie::Toggle 1.07 Tie::ToObject 0.03 Time::CTime 99.062201 Time::DaysInMonth 99.1117 Time::Epoch 0.02 Time::Fuzzy 0.34 Time::JulianDay 2003.1125 Time::ParseDate 2006.0814 Time::Timezone 2006.0814
我一直想将此作为一个功能添加到该cpan
工具中,所以我也会这样做.[时间流逝]而且,现在我有一个-l
开关cpan
.在我发布之前,我还有其他一些与它有关的事情,但它在github中.如果您不想等待,您可以尝试使用-a
开关创建一个自动提示,尽管这会将一些Pod放在列表中.
祝好运;
$ for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort Class::Inspector * "VERSION: 1.28" Crypt::CBC * "VERSION: 2.33" Crypt::Rijndael * "VERSION: 1.11" Data::Dump * "VERSION: 1.22" DBD::Oracle * "VERSION: 1.68" DBI * "VERSION: 1.630" Digest::SHA * "VERSION: 5.92" ExtUtils::MakeMaker * "VERSION: 6.84" install * "VERSION: 6.84" IO::SessionData * "VERSION: 1.03" IO::Socket::SSL * "VERSION: 2.016" JSON * "VERSION: 2.90" MIME::Base64 * "VERSION: 3.14" MIME::Base64 * "VERSION: 3.14" Mozilla::CA * "VERSION: 20141217" Net::SSLeay * "VERSION: 1.68" parent * "VERSION: 0.228" REST::Client * "VERSION: 271" SOAP::Lite * "VERSION: 1.08" Task::Weaken * "VERSION: 1.04" Term::ReadKey * "VERSION: 2.31" Test::Manifest * "VERSION: 1.23" Test::Simple * "VERSION: 1.001002" Text::CSV_XS * "VERSION: 1.16" Try::Tiny * "VERSION: 0.22" XML::LibXML * "VERSION: 2.0108" XML::NamespaceSupport * "VERSION: 1.11" XML::SAX::Base * "VERSION: 1.08"
这里有一个脚本可以解决这个问题:
use ExtUtils::Installed; my $inst = ExtUtils::Installed->new(); my @modules = $inst->modules(); foreach $module (@modules){ print $module ." - ". $inst->version($module). "\n"; } =head1 ABOUT This scripts lists installed cpan modules using the ExtUtils modules =head1 FORMAT Prints each module in the following format- =cut
我喜欢使用CPAN'r'命令.您可以使用旧样式进入CPAN shell:
sudo perl -MCPAN -e shell
或者,在大多数较新的系统上,都有一个'cpan'命令,所以这个命令会把你带到shell:
sudo cpan
(您通常必须使用'sudo'以root身份运行它,或者在运行之前使用'su - '成为root用户,除非您设置cpan以允许您以普通用户身份运行它,但以root用户身份安装.如果你在这台机器上没有root,你仍然可以使用CPAN shell来查找这些信息,但是你将无法安装模块,并且你可能需要在第一次安装时进行一些设置.运行.)
然后,一旦进入cpan shell,就可以使用'r'命令报告所有已安装的模块及其版本.因此,在"cpan>"提示符下键入"r".这将列出所有已安装的模块及其版本.使用 '?' 获得更多帮助.
这是一个非常hacky方式在*nix中执行它,你会得到一些你并不真正关心的东西(例如:warnings :: register etc),但是它应该给你一个可以访问的每个.pm文件的列表. perl的.
for my $path (@INC) {
my @list = `ls -R $path/**/*.pm`;
for (@list) {
s/$path\///g;
s/\//::/g;
s/\.pm$//g;
print;
}
}
您可以使用instmodsh
终端中的命令获取系统中安装的perl模块列表.它会询问您三个选项以增强它们的输出:
l - List all installed modules m- Select a module q - Quit the program
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'