Как получить список установленных модулей CPAN?

помимо попытки

perldoc <module name>

индивидуально для любого модуля CPAN, который мне нравится или проходит через файловую систему и смотрит на каталоги, я понятия не имею, какие модули мы установили.

каков самый простой способ просто получить большой список каждого установленного модуля CPAN? Из командной строки или иначе.

27 ответов


это ответ в Perl FAQ, ответ на который можно быстро найти с помощью perldoc -q installed. Короче говоря, это сводится к использованию ExtUtils::Installed или через File::Find варианты которые были охвачены ранее в этой теме.

вы также можете найти запись FAQ " как найти, какие модули установлены в моей системе?" в perlfaq3. Вы можете увидеть список всех ответов FAQ, посмотрев в perlfaq


perldoc perllocal

Edit: есть (немного) больше информации об этом в CPAN ДЛЯ ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ


стоит отметить, что perldoc perllocal будет сообщать только о модулях, установленных через CPAN. Если кто-то устанавливает модули вручную, он их не найдет. Кроме того, если у вас есть несколько человек, устанавливающих модули и perllocal.pod находится под контролем источника, люди могут неправильно разрешать конфликты и повреждать список (это произошло здесь на работе, например).

к сожалению, решение, похоже, проходит через @INC с File:: Find или что-то подобное. Однако, это не просто находит модули, это также находит связанные модули в дистрибутиве. Например, он сообщит TAP::Harness и TAP::Parser в дополнение к фактическому имени дистрибутива Test:: Harness (если у вас есть версия 3 или выше). Вы можете потенциально сопоставить их с именами дистрибутивов и отбросить те имена, которые не совпадают, но тогда вы можете отбросить локально построенные и установленные модули.

Я считаю, что работа по индексации backpan Брайана д Фоя должна есть код, чтобы передать его .pm-файл, и он попытается вывести дистрибутив, но даже это иногда не удается, потому что то, что находится в пакете, не обязательно установлено (см. Пример Devel::Cover::Inc).


вы можете попробовать ExtUtils-Установлен, но это только в .packlists, поэтому он может пропустить модули, в которые люди перемещали вещи в @INC вручную.

я писал App-Module-Lister для друга, который хотел сделать это как скрипт 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 переключатель для создания autobundle, хотя это кладет некоторый стручок вокруг список.

удачи,


perldoc -q installed

утверждает, что cpan -l сделает трюк, однако он не работает для меня. Другой вариант:

cpan -a

выплевывает хороший список установленных пакетов и имеет приятный побочный эффект записи их в файл.


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

=cut

мне нравится использовать команду CPAN ' r ' для этого. Вы можете попасть в оболочку CPAN со старым стилем:

sudo perl -MCPAN -e shell

или в большинстве новых систем есть команда "cpan", поэтому эта команда приведет вас к оболочке:

sudo cpan

(обычно вы должны использовать "sudo", чтобы запустить его как root, или использовать " su -", чтобы стать root, прежде чем запускать его, если у вас нет cpan, чтобы позволить вам запустить его как обычный пользователь, но установить как root. Если у вас нет root на этой машине, вы все еще можете используйте оболочку CPAN, чтобы узнать эту информацию, но вы не сможете установить модули, и вам, возможно, придется пройти немного настройки при первом запуске.)

затем, как только вы находитесь в оболочке cpan, вы можете использовать команду "r", чтобы сообщить обо всех установленных модулях и их версиях. Итак, в командной строке" cpan> "введите " r". Здесь будут перечислены все установленные модули и их версии. Используйте '? чтобы получить больше помощь.


вот действительно хакерский способ сделать это в *nix, вы получите некоторые вещи, о которых вы действительно не заботитесь (т. е.: предупреждения::регистрация и т. д.), Но он должен дать вам список каждого .PM-файл, доступный через perl.


for my $path (@INC) {
    my @list = `ls -R $path/**/*.pm`;
    for (@list) {
        s/$path\///g;
        s/\//::/g;
        s/\.pm$//g;
        print;
    }
}


вы можете получить список модулей perl, установленных в вашей системе, используя instmodsh команда в вашем терминале.Он попросит вас три варианта для того, чтобы увеличить выход они являются:

   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program

ответ можно найти в Perl FAQ список.

вы должны просмотреть отличную документацию, которая поставляется с Perl

perldoc perltoc

попробовать man perllocal или perldoc perllocal.


вот Perl one-liner, который распечатает список установленных модулей:

perl -MExtUtils::Installed -MData::Dumper -e  'my ($inst) = ExtUtils::Installed->new(); print Dumper($inst->modules());'

просто убедитесь, что у вас установлены Data::Dumper.


попробуйте выполнить следующую команду

instmodsh


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

Я написал сценарий perl только вчера, чтобы сделать именно это. Скрипт возвращает список модулей perl, установленных в @INC, используя в качестве разделителя'::'. Вызовите скрипт, используя -

perl perlmod.pl

или

perl perlmod.pl <module name> #Case-insensitive(eg. perl perlmod.pl ftp)

на данный момент скрипт пропускает текущий каталог('.') так как у меня были проблемы с рекурсивными программными ссылками, но вы можете включить его, изменив функцию grep в строке 17 из

  grep { $_ !~ '^\.$' } @INC

всего,

@INC

сценарий можно найти здесь.


вот еще один инструмент командной строки, чтобы перечислить все установленные .pm файлы:

найти установленные модули Perl, соответствующие регулярному выражению

  • портативный (использует только основные модули)
  • опция кэша для более быстрого поиска
  • настраиваемые параметры отображения

чтобы пройти через деревья каталогов @INC без использования внешней программы, такой как ls(1), можно использовать File::Find::Rule модуль, который имеет приятный декларативный интерфейс.

кроме того, вы хотите отфильтровать дубликаты, если предыдущие версии Perl содержат те же модули. Код для этого выглядит так:

#! /usr/bin/perl -l

use strict;
use warnings;
use File::Find::Rule;

my %seen;
for my $path (@INC) {
    for my $file (File::Find::Rule->name('*.pm')->in($path)) {
        my $module = substr($file, length($path)+1);
        $module =~ s/.pm$//;
        $module =~ s{[\/]}{::}g;
        print $module unless $seen{$module}++;
    }
}

в конце выполнения у вас также есть все имена модулей в качестве ключей в хэше %seen. Код может быть адаптирован для сохранения канонического имени файла (приведенного в $file) как значение ключа вместо того, чтобы видеть количество раз.


поваренная книга Perl содержит несколько итераций скрипта "pmdesc", который делает то, что вы хотите. Google-Поиск "Perl Поваренная книга pmdesc", и вы найдете статьи на других сайтах Q&A, несколько списков кода в сети, обсуждение решения и даже некоторые уточнения.


cd /the/lib/dir/of/your/perl/installation
perldoc $(find . -name perllocal.pod)

пользователи Windows просто выполняют поиск в Проводнике Windows, чтобы найти его.


следующее сработало для меня.

$ perldoc perllocal | grep Module
$ perldoc perllocal | grep -E 'VERSION|Module'

при вводе скрипта Perl у вас есть все установленные модули as .pm-файлы ниже папок в @INC, поэтому небольшой скрипт bash сделает эту работу за вас:

#!/bin/bash

echo -e -n "Content-type: text/plain\n\n"

inc=`perl -e '$, = "\n"; print @INC;'`

for d in $inc
do
   find $d -name '*.pm'
done

это работает для меня

perl -e 'print join("\n",@INC,"")'

в Linux / Unix я использую эту простую команду:

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

он сканирует всю папку в @INC и ищет любой *.файл pm.


для получения дополнительной информации используйте perldoc-q или просто введите

perldoc <Module::Name>

для Linux самый простой способ сделать это,

dpkg -l | grep "perl"

вот что я делаю: perl -M{cpan_module}
Если вы не получаете никаких ошибок, есть хороший шанс, что модуль установлен.