Як отримати список встановлених модулів CPAN?


88

Окрім спроб

perldoc <module name>

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

Який найпростіший спосіб просто отримати великий список кожного встановленого модуля CPAN? З командного рядка або іншим чином.


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

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

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

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

1
Це може бути корисно:instmodsh
Раві,

Відповіді:


65

На це дається відповідь у поширених запитаннях про Perl, відповідь на яку можна швидко знайти perldoc -q installed. Коротше кажучи, справа зводиться до використання ExtUtils::Installedчи використання File::Find, варіанти обох з яких вже висвітлювались у цій темі.

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


36
Це дає набагато більше, ніж вимагав OP, що він практично марний.
Джастін

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

10
У поширених запитаннях сказано використовувати, cpan -lале це не працює на RHEL6, і видає /usr/bin/cpan -lпомилку Unknown option: l.
Стефан Ласієвський

1
$ perldoc perllocal | grep Модуль $ perldoc perllocal | grep -E 'ВЕРСІЯ | Модуль'
caot

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

35
perldoc perllocal

Редагувати: про це (трохи) більше інформації в розділі поширених запитань про CPAN


2
Дякуємо за посилання на поширені запитання. На жаль, не всі модулі, які я знаю, встановлені, повертаються. Дата :: 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, щоб згорнути його тим дистрибутивом, який він знаходить у пакетах 02, може бути достатньо. Це, однак, трохи хитріше, ніж просто перерахування файлів модулів, і каталог ще не наближений до цього.
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

Дійсно недооцінена відповідь. Це також працює для дистрибутивів RHEL.
Крістіна

4
Я отримав:No documentation found for "perllocal".
Луїс А. Флоріт

Запуск тривав довше, ніж я очікував (приблизно 20 секунд на моїй машині), але це спрацювало бездоганно! Чудова відповідь.
Ганс Голдман,

19

Ви можете спробувати ExtUtils-Installed , але це виглядає лише через .packlists, тому може пропустити модулі, в які люди переносили речі@INC вручну.

Я написав App-Module-Lister для друга, який хотів зробити це як скрипт CGI в обліковому записі веб-хостингу без оболонки. Ви просто берете файл модуля і завантажуєте його як ім'я файлу, яке ваш сервер буде розглядати як сценарій CGI. Він не має залежностей поза Стандартною бібліотекою. Використовуйте його як є або вкрадіть код.

Він виводить список модулів та їх версій:

Краватка :: Цикл 1.15
Краватка :: IxHash 1.21
Краватка :: Переключити 1.07
Краватка :: ToObject 0,03
Час :: CTime 99.062201
Час :: DaysInMonth 99.1117
Час :: Епоха 0,02
Час :: Нечіткий 0,34
Час :: JulianDay 2003.1125
Час :: Дата розбору 2006.0814
Час :: Часовий пояс 2006.0814

Я мав намір додати це як функцію до cpanінструменту, тому зроблю це теж. [Час минає] І тепер у мене є -lперехід cpan. У мене є ще кілька речей, пов’язаних із цим, перш ніж випустити реліз, але це у github . Якщо ви не хочете цього чекати, ви можете просто спробувати -aперемикач, щоб створити автонабір, хоча це робить деякий Pod навколо списку.

Удачі;


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 Модулі не перелічені.
Ганс Дерагон,

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

В кінці запуску ви також маєте всі імена модулів як ключі в хеші% побачених. Код може бути адаптований для збереження канонічного імені файлу (вказаного в $ 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;

Ось чому я опинився на цій сторінці (розчарований)

(Я усвідомлюю, що це не відповідає точно на запитання ОП, але я публікую його для тих, хто опинився тут з тієї самої причини, що і я. Ось проблема зі стеком *** - майже неможливо знайти запитання, яке ви запитуючи, навіть коли він існує, але стек *** майже завжди є найпопулярнішим результатом Google!)


Це спрацювало для мене. Дякуємо, що розмістили це. Мені це потрібно було в середовищі, де я не маю великого доступу для встановлення / оновлення будь-яких залежностей.
Ashish Kumar


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
ОП запитав список модулів CPAN (perl), встановлених в системі, а не якщо в системі встановлено perl (ні ОП не повідомив нам, чи є apt)
ROLO 12.03.18

Я не експерт perl, але я бачив встановлені модулі perl з наведеної вище команди. Тут може бути не ідеальна відповідь.
Ясіру Г

-2

Це працює для мене

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

Дякуємо за цей фрагмент коду, який може надати обмежену негайну допомогу. Належне пояснення було б значно поліпшити свою довгострокову цінність , показуючи , чому це хороше рішення проблеми, і зробить його більш корисним для читачів майбутніх з іншими подібними питаннями. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи припущення, які ви зробили.
Machavity

-3

Ось що я роблю: perl -M{cpan_module}
Якщо ви не отримуєте помилок, є велика ймовірність того, що модуль встановлено.


2
Я не вірю, що це відповідає на питання. Використовуючи цю пропозицію, комусь може знадобитися якийсь час, щоб пройти модуль за модулем, щоб виявити, які модулі встановлені чи ні.
Dave Newman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.