如何获取已安装的CPAN模块列表?

Dav*_*lin 82 perl cpan

除了尝试

perldoc <module name>
Run Code Online (Sandbox Code Playgroud)

单独用于任何CPAN模块,我喜欢或浏览文件系统并查看目录我不知道我们安装了哪些模块.

获得安装的每个CPAN模块的最佳列表的最简单方法是什么?从命令行或其他方式.

pjf*_*pjf 62

这可以在Perl FAQ中找到,答案可以很快找到perldoc -q installed.简而言之,它归结为使用ExtUtils::Installed或使用File::Find,这两个变体已经在本主题中已经介绍过了.

您还可以找到FAQ条目"如何找到我的系统上安装的模块?" 在perlfaq3.您可以通过查看perlfaq查看所有常见问题解答答案的列表

  • 这比OP要求的要多得多,它实际上是无用的. (34认同)
  • `cld -l`在`perldoc -q installed`命令中的第一个条目. (13认同)
  • FAQ说使用`cpan -l`但是在RHEL6上不起作用,而`/ usr/bin/cpan -l`会抛出错误`Unknown option:l`. (9认同)
  • cpan -l正在对我运行它的任何目录进行递归搜索.有没有办法从该命令行传递`ExtUtils :: Installed`构造函数的`skip_cwd`选项? (2认同)

Dan*_*Dan 34

perldoc perllocal
Run Code Online (Sandbox Code Playgroud)

编辑:在CPAN FAQ中有关于它的更多信息

  • perldoc perllocal不会显示通过CPAN +安装的模块. (4认同)
  • 感谢您链接到常见问题解答.不幸的是,我所知道的所有模块都没有安装.Date :: Calc甚至没有出现在那里. (2认同)

Pau*_*bel 24

perldoc -q installed

声称cpan -l会做的伎俩,但它不适合我.另一种选择:

cpan -a

确实吐出了一个很好的已安装软件包列表,并且具有将它们写入文件的良好副作用.

  • 为了记录,`cpan -l`起作用(或者对我来说是CPAN v2.05).`cpan -a`确实更漂亮. (2认同)

Ovi*_*vid 23

值得注意的是,perldoc perllocal只会报告通过CPAN安装的模块.如果有人手动安装模块,则无法找到它们.此外,如果您有多个人安装模块并且perllocal.pod受源代码管理,那么人们可能会错误地解决冲突并破坏列表(例如,这在工作中已经发生).

令人遗憾的是,解决方案似乎是通过File :: Find或类似的东西走过@INC.但是,这不只是找到模块,它还在分布中找到相关模块.例如,除了Test :: Harness的实际分发名称之外,它还会报告TAP :: Harness和TAP :: Parser(假设您有版本3或更高版本).您可能会将它们与分发名称进行匹配,并丢弃那些不匹配的名称,但随后您可能会丢弃本地构建和安装的模块.

我相信brian d foy的backpan索引工作应该有代码将它传递给.pm文件并且它会尝试推断分发,但即使这有时也会失败,因为包中的内容不一定是安装的(参见Devel :: Cover :: Inc为例).

  • 从一个基本的测试(在我已经存在的一些dirs中进行"make -n install"),任何基于MakeMaker的模块的"make install"步骤将更新perllocal.它不是直接通过CPAN安装的. (2认同)

bri*_*foy 19

您可以尝试ExtUtils-Installed,但只能查看.packlists,因此它可能会错过人们@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放在列表中.

祝好运;


小智 17

$ 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"
Run Code Online (Sandbox Code Playgroud)

  • 我得到:`找不到有关“ perllocal”的文档。 (3认同)
  • 这对于我们这些没有安装 cpan 的人来说效果很好。 (2认同)

Joa*_*kim 10

这里有一个脚本可以解决这个问题:

 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
<name> - <version>

=cut
Run Code Online (Sandbox Code Playgroud)


小智 9

我喜欢使用CPAN'r'命令.您可以使用旧样式进入CPAN shell:

sudo perl -MCPAN -e shell
Run Code Online (Sandbox Code Playgroud)

或者,在大多数较新的系统上,都有一个'cpan'命令,所以这个命令会把你带到shell:

sudo cpan
Run Code Online (Sandbox Code Playgroud)

(您通常必须使用'sudo'以root身份运行它,或者在运行之前使用'su - '成为root用户,除非您设置cpan以允许您以普通用户身份运行它,但以root用户身份安装.如果你在这台机器上没有root,你仍然可以使用CPAN shell来查找这些信息,但是你将无法安装模块,并且你可能需要在第一次安装时进行一些设置.运行.)

然后,一旦进入cpan shell,就可以使用'r'命令报告所有已安装的模块及其版本.因此,在"cpan>"提示符下键入"r".这将列出所有已安装的模块及其版本.使用 '?' 获得更多帮助.

  • -r重新编译东西.要获取列表,请尝试-a或下载最新的源并使用新的-l开关进行播放,仅为此答案添加.:) (3认同)
  • 注意'cpan'的'-r'命令行参数和cpan shell中的'r'命令之间的区别:) (2认同)

小智 6

这是一个非常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;
    }
}

  • 这不会给他他想要的东西.它不会按照它们所属的分发对相关文件进行分组,它将列出Perl本身的所有核心*.pm文件. (2认同)

Thi*_*ATR 6

您可以使用instmodsh终端中的命令获取系统中安装的perl模块列表.它会询问您三个选项以增强它们的输出:

   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program
Run Code Online (Sandbox Code Playgroud)


Wer*_*eit 6

在 Linux/Unix 上,我使用这个简单的命令:

perl -e 'print qx/find $_ -name "*.pm"/ foreach ( @INC );' 
Run Code Online (Sandbox Code Playgroud)

它扫描所有文件夹@INC并查找任何 *.pm 文件。


小智 5

试试下面的命令

instmodsh


sla*_*fer 5

perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'
Run Code Online (Sandbox Code Playgroud)