Как получить список установленных модулей CPAN? - PullRequest
80 голосов
/ 22 сентября 2008

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

perldoc <module name>

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

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

Ответы [ 27 ]

63 голосов
/ 23 сентября 2008

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

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

33 голосов
/ 22 сентября 2008
perldoc perllocal

Редактировать: есть (немного) больше информации об этом в CPAN FAQ

24 голосов
/ 02 марта 2013

perldoc -q installed

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

cpan -a

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

23 голосов
/ 22 сентября 2008

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

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

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

19 голосов
/ 23 сентября 2008

Вы можете попробовать ExtUtils-Installed , но это выглядит только через .packlist s, поэтому он может пропустить модули, в которые люди перемещали вещи в @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, чтобы создать автоматическое расслоение, хотя это приводит к некоторому Pod в списке.

Удачи;

16 голосов
/ 05 июня 2015
$ 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"
10 голосов
/ 07 апреля 2011

Вот скрипт, который бы справился:

 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
9 голосов
/ 22 сентября 2008

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

sudo perl -MCPAN -e shell

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

sudo cpan

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

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

6 голосов
/ 14 ноября 2013

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

   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program
6 голосов
/ 22 сентября 2008

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


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

...