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


88

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

perldoc <module name>

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

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


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

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

Вы хотите знать, какие модули установлены или какие дистрибутивы установлены?
Тим Банс

4
Я обнаружил, cpan -lчто это полезно для себя на окнах.
недействителен

1
Это может быть полезно:instmodsh
Рави,

Ответы:


65

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

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


36
Это дает намного больше, чем требовал OP, что практически бесполезно.
Джастин

2
cpan -l выполняет рекурсивный поиск в любом каталоге, из которого я его запустил. Есть ли способ передать параметр ExtUtils::Installedконструктора skip_cwdиз этой командной строки?
Марк Рид

10
В FAQ сказано использовать, cpan -lно это не работает на RHEL6 и /usr/bin/cpan -lвызывает ошибку Unknown option: l.
Стефан Ласевски

1
$ perldoc perllocal | Модуль grep $ perldoc perllocal | grep -E 'VERSION | Module'
caot

используйте perldoc -t perllocal для вывода обычного текста, иначе grep может не работать из-за встроенных символов ctrl
user333869

35
perldoc perllocal

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


2
Спасибо за ссылку на FAQ. К сожалению, не все установленные мной модули возвращаются. Date :: Calc там даже не отображается.
Дэвид Маклафлин,

26

perldoc -q installed

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

cpan -a

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


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

23

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

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

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


1
Я не думаю, что мне нужно вытаскивать оружие из каталога BackPAN для этого. Что-то вроде того, что я делаю с Test :: Prereq, чтобы свернуть его по тому дистрибутиву, который он нашел в 02packages, может быть достаточно. Это немного сложнее, чем просто перечислить файлы модулей, и каталог еще не приблизился к тому, чтобы справиться с этим.
brian d foy,

2
Из элементарного теста (выполнение «make -n install» в некоторых каталогах, которые у меня есть), шаг «make install» любого модуля на основе MakeMaker обновит perllocal. Это не относится к установке напрямую через CPAN.
rjray

1
Я думаю, что Dist :: Surveyor по-прежнему является лучшим инструментом для ответа на вопрос «какие дистрибутивы установлены в этой библиотеке?». Смотрите эту презентацию для более подробной информации. В репозитории git есть простая в использовании версия с жирным пакетом .
Тим Банс,

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

2
это прекрасно работает для тех из нас, у кого не установлен cpan.
pdwalker 06

Действительно недооцененный ответ. Это также работает для дистрибутивов RHEL.
Кристина

4
Я получил:No documentation found for "perllocal".
Луис А. Флорит

Бег длился дольше, чем я ожидал (около 20 секунд на моей машине), но он работал безупречно! Отличный ответ.
Ханс Гольдман,

19

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

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

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

Галстук :: Цикл 1.15
Галстук :: IxHash 1.21
Галстук :: Toggle 1.07
Связь :: ToObject 0.03
Время :: CTime 99.062201
Time :: DaysInMonth 99.1117
Время :: Эпоха 0,02
Время :: Нечеткое 0,34
Время :: JulianDay 2003.1125
Time :: ParseDate 2006.0814
Время :: Часовой пояс 2006.0814

Я хотел добавить это как функцию к cpanинструменту, так что я тоже это сделаю. [Время идет] И теперь у меня есть -lпереключатель cpan. У меня есть еще несколько вещей, которые нужно сделать с ним, прежде чем я сделаю релиз, но он находится на github . Если вы не хотите этого ждать, вы можете просто попробовать -aпереключатель для создания автогруппировки, хотя это помещает в список несколько модулей.

Удачи;


12

Вот сценарий, который поможет:

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

В RHEL 6.9 эти скрипты выводят только следующее: Perl - 5.10.1 Модули не указаны.
Hans Deragon

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. Если ваша установка не очень устарела, это не будет полный список.
EvdB,

Мой "r" всегда почти ничего не сообщает, потому что я навязчиво обновляюсь. Это напоминает мне ... Я еще не обновился сегодня.
skiphoppy

3
-R перекомпилирует материал. Чтобы получить список, попробуйте -a или загрузите последние источники и поиграйте с новым переключателем -l, добавленным только для этого ответа. :)
brian d foy

1
Почему sudoздесь? Это совершенно не нужно.
Аристотель Пагальцис,

2
обратите внимание на разницу между аргументом командной строки '-r' и 'cpan' и командой 'r' в оболочке cpan :)
EvdB

7

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

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

Это очень хорошо, так как четко показывает полный путь к каждому *.pmмодулю. Вы можете увидеть много дубликатов ...
not2qubit

7

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

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

5

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

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

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


Спасибо! Очень полезно.
not2qubit

Спасибо! Это, пожалуй, самое интересное, чему меня когда-либо учили с таким лаконичным выражением.
ewd




1

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

perl perlmod.pl

ИЛИ

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

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

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

чтобы просто,

@INC

Скрипт можно найти здесь.


1

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

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

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

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}++;
    }
}

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


1

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

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

1

Для всех, кто не может установить 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, но я отправляю его для всех, кто оказался здесь по той же причине, что и я. Это проблема со стеком ***, почти невозможно найти вопрос, который вы спрашивает, даже если он существует, но stack *** почти всегда является лучшим хитом Google!)


Это сработало для меня. Спасибо, что разместили это. Мне это было нужно в среде, где у меня нет доступа для установки / обновления каких-либо зависимостей.
Ашиш Кумар

0

поваренная книга Perl содержит несколько итераций сценария pmdesc, который делает то, что вы хотите. Выполните поиск в Google по запросу «Perl Cookbook pmdesc», и вы найдете статьи на других сайтах вопросов и ответов , несколько списков кода в сети, обсуждение решения и даже некоторые уточнения .


0

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

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

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


2
Здесь перечислено только около 15 модулей perl вместо 5945, перечисленных в cpan -l.
Пол Томблин

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

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



0

Вот сценарий @ JamesThomasMoon1979, переписанный как однострочный

perl -MExtUtils::Installed -e '$i=ExtUtils::Installed->new(); 
      print "$_ ".$i->version($_)."\n" for $i->modules();'

-1

Когда вы вводите свой Perl-скрипт, у вас есть все установленные модули в виде файлов .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

Почему нет? find `perl -le'print for@INC'` -name '*.pm'
Hynek -Pichi- Vychodil

-2

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

dpkg -l | grep "perl"

1
OP запросил список модулей CPAN (perl), установленных в системе, а не в том случае, если в системе установлен perl (ни один OP не сообщил нам, доступен ли apt)
ROLO

Я не эксперт по Perl, но я видел установленные модули Perl из указанной выше команды. Возможно, это не лучший ответ.
Yasiru G

-2

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

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

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

-3

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


2
Я не верю, что это ответ на вопрос. Используя это предложение, кому-то может потребоваться некоторое время, чтобы просмотреть модуль за модулем, чтобы определить, какие модули установлены или нет.
Дэйв Ньюман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.