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

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

perldoc <module name>

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

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

Ответ 1

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

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

Ответ 2

perldoc perllocal

Изменить: там (немного) больше информации об этом в CPAN FAQ

Ответ 3

perldoc -q installed

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

cpan -a

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

Ответ 4

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

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

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

Ответ 5

Вы можете попробовать ExtUtils-Installed, но это выглядит только в .packlist s, поэтому он может пропустить модули, в которые люди перемещали вещи в @INC вручную.

Я написал App-Module-Lister для друга, который хотел сделать это как CGI script на учетной записи хостинга без оболочки. Вы просто берете файл модуля и загружаете его как имя файла, которое ваш сервер будет рассматривать как CGI script. У него нет зависимостей вне стандартной библиотеки. Используйте его как есть или украдите код.

Он выводит список модулей и их версий:

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 вокруг списка.

Удачи,

Ответ 6

$ 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"

Ответ 7

Здесь script, который выполнит трюк:

 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

Ответ 8

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

sudo perl -MCPAN -e shell

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

sudo cpan

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

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

Ответ 9

Здесь действительно хакерский способ сделать это в * 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;
    }
}

Ответ 10

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

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

Ответ 11

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

Ответ 12

Ответ можно найти в Perl FAQ.

Вам следует отказаться от отличной документации, которая поставляется с Perl

perldoc perltoc

Ответ 13

Попробуйте man perllocal или perldoc perllocal.

Ответ 14

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

instmodsh

Ответ 15

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

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

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

Ответ 16

Чтобы пройти через деревья каталога @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}++;
    }
}

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

Ответ 17

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

perl perlmod.pl

ИЛИ

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

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

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

просто,

@INC

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

Ответ 19

Я могу предложить использовать pmtools, особенно pminst, который принимает регулярные выражения.

Ответ 20

Здесь находится однострочный Perl, который будет распечатывать список установленных модулей:

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

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

Ответ 21

perl-pmtools - хороший инструмент для вас.

Ответ 22

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

Ответ 23

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

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

Ответ 24

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

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

Ответ 25

Попробуйте "perldoc -l":

$ perldoc -l Log :: Dispatch /usr/local/share/perl/5.26.1/Log/Dispatch.pm

Ответ 26

Всем тем, кто не может установить perldoc или другие модули и хочет знать, какие модули доступны (CPAN или иным образом), для linux и Mingw32/64 работает следующее:

grep -RhIP '^package [A-Z][\w:]+;' 'perl -e 'print join " ",@INC'' | sed 's/package //' | sort | uniq

Да, это грязно. Да, это, вероятно, сообщает больше, чем вы хотите. Но если вы передадите его в файл, вы можете легко проверить, скажем, какие интерфейсы dbm присутствуют:

 grep -RhIP '^package [A-Z][\w:]+;' 'perl -e 'print join " ",@INC'' | sed 's/package //' | sort | uniq > modules-installed
 cat modules-installed | grep -i dbm 

AnyDBM_File;
Memoize::AnyDBM_File;
Memoize::NDBM_File;
Memoize::SDBM_File;
WWW::RobotRules::AnyDBM_File;

Именно поэтому я попал на эту страницу (разочарован)

(Я понимаю, что это не дает точного ответа на вопрос OP, но я публикую его для всех, кто попал сюда по той же причине, что и я. То, что проблема со стеком ***, почти невозможно найти вопрос, который вы задаете, даже если он существует, но стек *** почти всегда является хитом Google!)

Ответ 27

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

perldoc <Module::Name>

Ответ 28

Когда вы вводите свой Perl script, у вас есть все установленные модули в виде файлов .pm под папками в @INC, поэтому небольшой bash script выполнит эту работу для вас:

#!/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

Ответ 29

Для Linux самый простой способ получить -

dpkg -l | grep "perl"

Ответ 30

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

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