Как получить список установленных модулей CPAN?
помимо попытки
perldoc <module name>
индивидуально для любого модуля CPAN, который мне нравится или проходит через файловую систему и смотрит на каталоги, я понятия не имею, какие модули мы установили.
каков самый простой способ просто получить большой список каждого установленного модуля CPAN? Из командной строки или иначе.
27 ответов
это ответ в Perl FAQ, ответ на который можно быстро найти с помощью perldoc -q installed
. Короче говоря, это сводится к использованию ExtUtils::Installed
или через File::Find
варианты которые были охвачены ранее в этой теме.
вы также можете найти запись FAQ " как найти, какие модули установлены в моей системе?" в perlfaq3. Вы можете увидеть список всех ответов FAQ, посмотрев в perlfaq
perldoc perllocal
Edit: есть (немного) больше информации об этом в CPAN ДЛЯ ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
стоит отметить, что perldoc perllocal будет сообщать только о модулях, установленных через CPAN. Если кто-то устанавливает модули вручную, он их не найдет. Кроме того, если у вас есть несколько человек, устанавливающих модули и perllocal.pod находится под контролем источника, люди могут неправильно разрешать конфликты и повреждать список (это произошло здесь на работе, например).
к сожалению, решение, похоже, проходит через @INC с File:: Find или что-то подобное. Однако, это не просто находит модули, это также находит связанные модули в дистрибутиве. Например, он сообщит TAP::Harness и TAP::Parser в дополнение к фактическому имени дистрибутива Test:: Harness (если у вас есть версия 3 или выше). Вы можете потенциально сопоставить их с именами дистрибутивов и отбросить те имена, которые не совпадают, но тогда вы можете отбросить локально построенные и установленные модули.
Я считаю, что работа по индексации backpan Брайана д Фоя должна есть код, чтобы передать его .pm-файл, и он попытается вывести дистрибутив, но даже это иногда не удается, потому что то, что находится в пакете, не обязательно установлено (см. Пример Devel::Cover::Inc).
вы можете попробовать ExtUtils-Установлен, но это только в .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
переключатель для создания autobundle, хотя это кладет некоторый стручок вокруг список.
удачи,
perldoc -q installed
утверждает, что cpan -l
сделает трюк, однако он не работает для меня. Другой вариант:
cpan -a
выплевывает хороший список установленных пакетов и имеет приятный побочный эффект записи их в файл.
$ 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"
вот скрипт, который сделает трюк:
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
мне нравится использовать команду CPAN ' r ' для этого. Вы можете попасть в оболочку CPAN со старым стилем:
sudo perl -MCPAN -e shell
или в большинстве новых систем есть команда "cpan", поэтому эта команда приведет вас к оболочке:
sudo cpan
(обычно вы должны использовать "sudo", чтобы запустить его как root, или использовать " su -", чтобы стать root, прежде чем запускать его, если у вас нет cpan, чтобы позволить вам запустить его как обычный пользователь, но установить как root. Если у вас нет root на этой машине, вы все еще можете используйте оболочку CPAN, чтобы узнать эту информацию, но вы не сможете установить модули, и вам, возможно, придется пройти немного настройки при первом запуске.)
затем, как только вы находитесь в оболочке cpan, вы можете использовать команду "r", чтобы сообщить обо всех установленных модулях и их версиях. Итак, в командной строке" cpan> "введите " r". Здесь будут перечислены все установленные модули и их версии. Используйте '? чтобы получить больше помощь.
вот действительно хакерский способ сделать это в *nix, вы получите некоторые вещи, о которых вы действительно не заботитесь (т. е.: предупреждения::регистрация и т. д.), Но он должен дать вам список каждого .PM-файл, доступный через perl.
for my $path (@INC) {
my @list = `ls -R $path/**/*.pm`;
for (@list) {
s/$path\///g;
s/\//::/g;
s/\.pm$//g;
print;
}
}
вы можете получить список модулей perl, установленных в вашей системе, используя instmodsh
команда в вашем терминале.Он попросит вас три варианта для того, чтобы увеличить выход они являются:
l - List all installed modules
m <module> - Select a module
q - Quit the program
ответ можно найти в Perl FAQ список.
вы должны просмотреть отличную документацию, которая поставляется с Perl
perldoc perltoc
вот Perl one-liner, который распечатает список установленных модулей:
perl -MExtUtils::Installed -MData::Dumper -e 'my ($inst) = ExtUtils::Installed->new(); print Dumper($inst->modules());'
просто убедитесь, что у вас установлены Data::Dumper.
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'
Я написал сценарий perl только вчера, чтобы сделать именно это. Скрипт возвращает список модулей perl, установленных в @INC, используя в качестве разделителя'::'. Вызовите скрипт, используя -
perl perlmod.pl
или
perl perlmod.pl <module name> #Case-insensitive(eg. perl perlmod.pl ftp)
на данный момент скрипт пропускает текущий каталог('.') так как у меня были проблемы с рекурсивными программными ссылками, но вы можете включить его, изменив функцию grep в строке 17 из
grep { $_ !~ '^\.$' } @INC
всего,
@INC
сценарий можно найти здесь.
вот еще один инструмент командной строки, чтобы перечислить все установленные .pm файлы:
найти установленные модули Perl, соответствующие регулярному выражению
- портативный (использует только основные модули)
- опция кэша для более быстрого поиска
- настраиваемые параметры отображения
чтобы пройти через деревья каталогов @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}++;
}
}
в конце выполнения у вас также есть все имена модулей в качестве ключей в хэше %seen. Код может быть адаптирован для сохранения канонического имени файла (приведенного в $file) как значение ключа вместо того, чтобы видеть количество раз.
поваренная книга Perl содержит несколько итераций скрипта "pmdesc", который делает то, что вы хотите. Google-Поиск "Perl Поваренная книга pmdesc", и вы найдете статьи на других сайтах Q&A, несколько списков кода в сети, обсуждение решения и даже некоторые уточнения.
cd /the/lib/dir/of/your/perl/installation
perldoc $(find . -name perllocal.pod)
пользователи Windows просто выполняют поиск в Проводнике Windows, чтобы найти его.
следующее сработало для меня.
$ perldoc perllocal | grep Module
$ perldoc perllocal | grep -E 'VERSION|Module'
при вводе скрипта Perl у вас есть все установленные модули as .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
в Linux / Unix я использую эту простую команду:
perl -e 'print qx/find $_ -name "*.pm"/ foreach ( @INC );'
он сканирует всю папку в @INC
и ищет любой *.файл pm.
для получения дополнительной информации используйте perldoc-q или просто введите
perldoc <Module::Name>
вот что я делаю: perl -M{cpan_module}
Если вы не получаете никаких ошибок, есть хороший шанс, что модуль установлен.