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



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



perldoc <module name>


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



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

742   27  

27 ответов:

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

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

perldoc perllocal

Edit: есть (немного) больше информации об этом в 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

попробовать man perllocal или perldoc perllocal.

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

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

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

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

instmodsh

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

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

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

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

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

она сканирует все папки, в @INC и ищет каких-либо *.файл личку.

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

perldoc <Module::Name>

для Linux самый простой способ сделать это,

dpkg -l | grep "perl"

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

Comments

    Ничего не найдено.