Как получить список установленных модулей 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 можно найти здесь.
Ответ 18
Вот еще один инструмент командной строки для списка всех установленных файлов .pm:
Найти установленные модули Perl, соответствующие регулярному выражению
- Portable (использует только модули ядра)
- Параметр кэша для быстрого поиска
- Конфигурируемые параметры отображения
Ответ 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,"")'