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

79

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

perldoc <module name>

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

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

  • 0
    Я могу предложить использовать pmtools , особенно pminst, который принимает регулярные выражения.
  • 0
    Perl-pmtools - хороший инструмент для вас.
Показать ещё 2 комментария
Теги:
cpan

28 ответов

64
Лучший ответ

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

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

  • 31
    Это дает намного больше, чем запрошенный OP, что практически бесполезно.
  • 12
    cpan -l первая запись в perldoc -q installed команде perldoc -q installed .
Показать ещё 4 комментария
32
perldoc perllocal

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

  • 2
    Спасибо за ссылку на FAQ. К сожалению, не все установленные мной модули возвращаются. Date :: Calc даже не появляется там.
  • 4
    Perldoc Perllocal не будет отображать модули, установленные через CPAN +.
23

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

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

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

  • 1
    Я не думаю, что мне нужно вытащить оружие из каталога BackPAN для этого. Что-то вроде того, что я делаю с Test :: Prereq, чтобы свернуть его по тому дистрибутиву, который он находит в пакетах 02, может быть достаточно. Это немного сложнее, чем просто перечислить файлы модуля, и каталог еще не близок к тому, чтобы справиться с этим.
  • 2
    Из элементарного теста (выполнение make -n install в некоторых каталогах, которые у меня есть), шаг make make любого модуля на основе MakeMaker обновит perllocal. Это не специально для установки через CPAN напрямую.
Показать ещё 1 комментарий
19

perldoc -q installed

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

cpan -a

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

  • 2
    Для записи, cpan -l работает (или работает для меня с CPAN v2.05). cpan -a действительно красивее.
19

Вы можете попробовать 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 вокруг списка.

Удачи,

15
$ 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"
  • 1
    это хорошо работает для тех из нас, у кого не установлен cpan.
  • 0
    Действительно недооцененный ответ. Это также работает для дистрибутивов RHEL.
Показать ещё 2 комментария
9

Здесь 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
  • 0
    В соответствии с RHEL 6.9 этот сценарий печатает только следующее: Perl - 5.10.1 Модули не перечислены.
9

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

sudo perl -MCPAN -e shell

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

sudo cpan

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

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

  • 1
    фактически 'r' дает вам рекомендации по переустановке - т.е. все модули в вашей установке, которые имеют более новую версию CPAN. Если ваша установка не устарела, это не будет полный список.
  • 0
    Мой 'r' всегда сообщает почти ничего, потому что я обновляюсь принудительно. Что напоминает мне ... Я еще не обновился сегодня.
Показать ещё 4 комментария
6

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

  • 2
    Это не даст ему то, что он хочет. Он не будет группировать связанные файлы по распределению, частью которого они являются, и перечислит все основные файлы * .pm из самого Perl.
5

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

   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program
2
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'
  • 0
    Это очень хорошо, так как четко показывает полный путь к каждому *.pm модулю. Вы можете увидеть много дубликатов ...
2

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

instmodsh

2

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

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

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

  • 1
    В нем перечислены только около 15 модулей Perl вместо 5945, которые перечислены в «cpan -l».
2

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

2

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

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

perldoc perltoc
1

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

1

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

1

Вот еще один инструмент командной строки для списка всех установленных файлов .pm:

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

  • Portable (использует только модули ядра)
  • Параметр кэша для быстрого поиска
  • Конфигурируемые параметры отображения
1

Я написал 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 можно найти здесь.

1

Чтобы пройти через деревья каталога @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) в качестве значения ключа вместо количества просмотренных раз.

0

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

perl -e 'print join("\n",@INC,"")'
  • 0
    Спасибо за этот фрагмент кода, который может оказать некоторую ограниченную, немедленную помощь. Правильное объяснение значительно улучшило бы его долгосрочную ценность , показав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими, похожими вопросами. Пожалуйста, измените свой ответ, чтобы добавить некоторые объяснения, в том числе предположения, которые вы сделали.
  • 0
    Это только показать возможные пути установки ...
0

Когда вы вводите свой 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
  • 0
    Почему бы и нет? find `perl -le'print for@INC'` -name '*.pm'
0

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

$ perldoc perllocal | grep Module
$ perldoc perllocal | grep -E 'VERSION|Module'
0
cd /the/lib/dir/of/your/perl/installation
perldoc $(find . -name perllocal.pod)

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

0

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

-1

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

dpkg -l | grep "perl"
  • 1
    ОП запросил список модулей CPAN (perl), установленных в системе, а не в том случае, если в системе установлен perl (ни ОП не сообщил нам, если apt доступен)
  • 0
    Я не эксперт по Perl, но я видел команду perl, установленную сверху. Может быть, не идеальный ответ здесь.
-2

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

perldoc <Module::Name>
-4

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

  • 2
    Я не верю, что это отвечает на вопрос. Используя это предложение, может потребоваться некоторое время, чтобы пройти модуль за модулем, чтобы узнать, какие модули установлены или нет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню