Как получить список установленных модулей CPAN?
помимо попытки
perldoc <module name>
индивидуально для любого модуля CPAN, который мне нравится или проходит через файловую систему и смотрит на каталоги, я понятия не имею, какие модули мы установили.
каков самый простой способ просто получить большой список каждого установленного модуля CPAN? Из командной строки или иным образом.
27 ответов:
Это ответ в Perl FAQ, ответ на который можно быстро найти с помощью
perldoc -q installed. Короче говоря, это сводится к использованиюExtUtils::Installedили черезFile::Findварианты которые были охвачены ранее в этой теме.вы также можете найти запись FAQ " как узнать, какие модули установлены в моей системе?" в perlfaq3. Вы можете увидеть список всех ответов на часто задаваемые вопросы, заглянув в perlfaq
perldoc perllocalEdit: есть (немного) больше информации об этом в CPAN FAQ
стоит отметить, что perldoc perllocal будет сообщать только о модулях, установленных через CPAN. Если кто-то устанавливает модули вручную, он их не найдет. Кроме того, если у вас есть несколько человек, устанавливающих модули и perllocal.pod находится под управлением исходного кода, люди могут неправильно разрешать конфликты и повреждать список (это произошло здесь на работе, например).
к сожалению, решение, похоже, проходит через @INC с File:: Find или что-то подобное. Однако, это не просто найти модули, он также находит связанные модули в дистрибутиве. Например, он сообщит TAP::Harness и TAP::Parser в дополнение к фактическому имени дистрибутива Test:: Harness (при условии, что у вас есть версия 3 или выше). Вы можете потенциально сопоставить их с именами дистрибутивов и отбросить те имена, которые не совпадают, но тогда вы можете отбросить локально построенные и установленные модули.
Я считаю, что работа Брайана д Фоя по индексации backpan должна есть код, чтобы передать его в файл. pm, и он попытается вывести дистрибутив, но даже это иногда не удается, потому что то, что находится в пакете, не обязательно установлено (см. Devel::Cover::Inc для примера).
вы можете попробовать ExtUtils-Установлен, но это только в
.packlists, поэтому он может пропустить модули, которые люди переместили в@INCвручную.я писал Приложение-Модуль-Листер для друга, который хотел сделать это как сценарий 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команда в вашем terminal.It попросит вас три варианта для того, чтобы увеличить выход они являются:l - List all installed modules m <module> - Select a module q - Quit the program
ответ можно найти в список часто задаваемых вопросов по Perl.
вы должны просмотреть отличную документацию, которая поставляется с 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 hash. Код может быть адаптирован для сохранения канонического имени файла (заданного в $file) как значение ключа, а не количество раз увиденное.
поваренная книга Perl содержит несколько итераций скрипта "pmdesc", который делает то, что вы хотите. Google-Поиск "Perl Cookbook pmdesc" и вы найдете статьи на других сайтах вопросов и ответов, несколько списков кода в сети, обсуждение решения и даже некоторые уточнения.
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, у вас есть все установленные модули в виде файлов. 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и ищет каких-либо *.файл личку.
используйте perldoc-q установлен для получения дополнительной информации или просто введите
perldoc <Module::Name>
вот что я делаю:
perl -M{cpan_module}
Если вы не получаете никаких ошибок есть хороший шанс, что модуль установлен.
Comments