Jak uzyskać listę zainstalowanych modułów CPAN?

88

Oprócz próbowania

perldoc <module name>

indywidualnie dla dowolnego modułu CPAN, który mi się podoba lub przegląda system plików i patrząc na katalogi Nie mam pojęcia, jakie moduły zainstalowaliśmy.

Jaki jest najłatwiejszy sposób uzyskania dużej listy wszystkich zainstalowanych modułów CPAN? Z wiersza poleceń lub w inny sposób.

David McLaughlin
źródło
Mogę zasugerować użycie narzędzi pmtools , zwłaszcza pminst, który akceptuje wyrażenia regularne.
lukmdo
perl-pmtools to dobre narzędzie dla Ciebie.
jaseywang
Czy chcesz wiedzieć, jakie moduły są zainstalowane lub jakie dystrybucje są zainstalowane?
Tim Bunce,
4
Okazało się, cpan -lże jest przydatny dla siebie w systemie Windows.
nieważne
1
To może być przydatne:instmodsh
Ravi

Odpowiedzi:

65

Odpowiedzi na to można znaleźć w Perl FAQ, odpowiedź, którą można szybko znaleźć za pomocą perldoc -q installed. Krótko mówiąc, sprowadza się do używania ExtUtils::Installedlub używania File::Findwariantów obu, które zostały wcześniej omówione w tym wątku.

Można również znaleźć wpis w często zadawanych pytaniach „Jak sprawdzić, które moduły są zainstalowane w moim systemie?” w perlfaq3. Możesz zobaczyć listę wszystkich odpowiedzi na często zadawane pytania, zaglądając do perlfaq

pjf
źródło
36
Daje to o wiele więcej, niż żądał PO, że jest praktycznie bezużyteczne.
Justin
2
cpan -l wykonuje cykliczne przeszukiwanie dowolnego katalogu, z którego go uruchamiam. Czy istnieje sposób na przekazanie opcji ExtUtils::Installedkonstruktora skip_cwdz tego wiersza poleceń?
Mark Reed
10
Często zadawane pytania mówią, aby użyć, cpan -lale to nie działa na RHEL6 i /usr/bin/cpan -lzgłasza błąd Unknown option: l.
Stefan Lasiewski
1
$ perldoc perllocal | grep Moduł $ perldoc perllocal | grep -E 'VERSION | Module'
caot
użyj perldoc -t perllocal, aby uzyskać zwykły tekst, w przeciwnym razie grep może nie działać z powodu osadzonych znaków ctrl
user333869
35
perldoc perllocal

Edycja: Jest (trochę) więcej informacji na ten temat w CPAN FAQ

Dan
źródło
2
Dzięki za link do FAQ. Niestety nie wszystkie moduły, które znam, są już zainstalowane, wracają. Date :: Calc nawet tam nie pojawia się.
David McLaughlin,
26

perldoc -q installed

twierdzi, że cpan -lzałatwi sprawę, ale nie działa dla mnie. Inna opcja:

cpan -a

wypluwa ładną listę zainstalowanych pakietów i ma przyjemny efekt uboczny zapisywania ich do pliku.

Paul Rubel
źródło
2
Dla przypomnienia, cpan -ldziała (lub działa z CPAN v2.05). cpan -ajest rzeczywiście ładniejszy.
William Turrell
23

Warto zauważyć, że perldoc perllocal będzie raportować tylko o modułach zainstalowanych przez CPAN. Jeśli ktoś zainstaluje moduły ręcznie, nie znajdzie ich. Ponadto, jeśli masz wiele osób instalujących moduły, a perllocal.pod jest pod kontrolą źródła, ludzie mogą nieprawidłowo rozwiązywać konflikty i uszkodzić listę (zdarzyło się to na przykład w pracy).

Niestety, wydaje się, że rozwiązaniem jest przejście przez @INC z File :: Find lub czymś podobnym. Jednak to nie tylko znajduje moduły, ale także znajduje powiązane moduły w dystrybucji. Na przykład zgłosi TAP :: Harness i TAP :: Parser oprócz rzeczywistej nazwy dystrybucji Test :: Harness (zakładając, że masz wersję 3 lub nowszą). Możesz potencjalnie dopasować je do nazw dystrybucji i odrzucić te, które nie pasują, ale wtedy możesz odrzucać lokalnie zbudowane i zainstalowane moduły.

Uważam, że praca indeksowania backpan Briana d foy powinna mieć kod do przekazania go w pliku .pm i będzie próbował wywnioskować dystrybucję, ale nawet to czasami kończy się niepowodzeniem, ponieważ zawartość pakietu niekoniecznie jest zainstalowana (zobacz Devel :: Cover :: Inc).

Owidiusz
źródło
1
Nie sądzę, żebym musiał wyciągać z niego pistolety z katalogu BackPAN. Coś takiego, jak robię z Test :: Prereq, aby zwinąć go według dystrybucji, którą znajdzie w pakietach 02, może wystarczyć. Jest to jednak trochę trudniejsze niż zwykłe wylistowanie plików modułów, a katalog nie jest jeszcze bliski ich obsłużenia.
brian d foy
2
Z podstawowego testu (wykonanie „make -n install” w niektórych katalogach, które mam w pobliżu), krok „make install” dowolnego modułu opartego na MakeMaker będzie aktualizował się lokalnie. Nie dotyczy to bezpośredniej instalacji przez CPAN.
rjray
1
Myślę, że Dist :: Surveyor jest nadal najlepszym narzędziem do odpowiedzi na pytanie "jakie dystrybucje są zainstalowane w tej bibliotece?". Zobacz tę prezentację na więcej szczegółów. W repozytorium git dostępna jest łatwa w użyciu wersja z pakietem tłuszczu .
Tim Bunce,
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"
Dan
źródło
2
działa to dobrze dla tych z nas, którzy nie mają zainstalowanego cpan.
pdwalker
Naprawdę niedoceniana odpowiedź. Działa to również w przypadku dystrybucji RHEL.
Cristina
4
Dostałem:No documentation found for "perllocal".
Luis A. Florit
Trwało to dłużej, niż się spodziewałem (około 20 sekund na mojej maszynie), ale działało bez zarzutu! Świetna odpowiedź.
Hans Goldman,
19

Możesz wypróbować ExtUtils-Installed , ale wygląda to tylko w .packlists, więc może brakować modułów, do których ludzie przenosili rzeczy @INCręcznie.

Napisałem App-Module-Lister dla znajomego, który chciał to zrobić jako skrypt CGI na koncie hostingowym innym niż powłoka. Wystarczy pobrać plik modułu i przesłać go jako nazwę pliku, którą serwer będzie traktował jako skrypt CGI. Nie ma żadnych zależności poza biblioteką standardową. Użyj go bez zmian lub ukradnij kod.

Wyświetla listę modułów i ich wersji:

Krawat :: Cykl 1.15
Krawat :: IxHash 1.21
Krawat :: Przełącz 1.07.0
Krawat :: ToObject 0.03.0
Czas :: CTime 99.062201
Czas :: DaysInMonth 99.1117
Czas :: Epoka 0,02
Czas :: Fuzzy 0.34
Czas :: JulianDay 2003.1125
Czas :: ParseDate 2006.0814
Czas :: Strefa czasowa 2006.0814

Chciałem dodać to jako funkcję do cpannarzędzia, więc też to zrobię. [Czas płynie] A teraz mam -lprzełącznik cpan. Mam kilka innych rzeczy do zrobienia przed wydaniem, ale jest to na githubie . Jeśli nie chcesz na to czekać, możesz po prostu wypróbować -aprzełącznik, aby utworzyć autobundle, chociaż powoduje to umieszczenie niektórych Podów na liście.

Powodzenia;

brian d foy
źródło
12

Oto skrypt, który załatwi sprawę:

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
Joakim
źródło
W RHEL 6.9 ta kaseta drukuje tylko następujące informacje: Perl - 5.10.1 Moduły nie są wymienione.
Hans Deragon,
9

W tym celu lubię używać polecenia CPAN „r”. Możesz dostać się do powłoki CPAN w starym stylu:

sudo perl -MCPAN -e shell

lub, w większości nowszych systemów, istnieje polecenie 'cpan', więc to polecenie przeniesie Cię do powłoki:

sudo cpan

(Zwykle musisz użyć 'sudo', aby uruchomić go jako root, lub 'su -', aby zostać rootem przed uruchomieniem go, chyba że masz skonfigurowany cpan, aby umożliwić uruchamianie go jako zwykły użytkownik, ale zainstaluj jako root. Jeśli nie masz roota na tym komputerze, nadal możesz użyć powłoki CPAN, aby znaleźć te informacje, ale nie będziesz w stanie zainstalować modułów i być może będziesz musiał przejść przez trochę konfiguracji za pierwszym razem Uruchom.)

Następnie, gdy jesteś w powłoce cpan, możesz użyć polecenia „r”, aby zgłosić wszystkie zainstalowane moduły i ich wersje. Zatem po znaku zachęty „cpan>” wpisz „r”. Spowoduje to wyświetlenie wszystkich zainstalowanych modułów i ich wersji. Posługiwać się '?' aby uzyskać dodatkową pomoc.

więcej
źródło
1
w rzeczywistości 'r' podaje zalecenia dotyczące ponownej instalacji - tj. wszystkie moduły w twojej instalacji, które mają nowszą wersję CPAN. O ile Twoja instalacja nie jest bardzo nieaktualna, nie będzie to pełna lista.
EvdB
Moje „r” zawsze wskazuje prawie nic, ponieważ kompulsywnie uaktualniam. Co mi przypomina ... Nie zaktualizowałem jeszcze dzisiaj.
skiphoppy
3
-R rekompiluje rzeczy. Aby uzyskać listę, wypróbuj -a lub pobierz najnowsze źródła i graj z nowym przełącznikiem -l, dodanym tylko dla tej odpowiedzi. :)
brian d foy
1
Dlaczego sudotutaj? To zupełnie niepotrzebne.
Arystoteles Pagaltzis
2
zwróć uwagę na różnicę między argumentem wiersza poleceń „-r” a „cpan”, a poleceniem „r” w powłoce
cpan
7

Oto naprawdę hakerski sposób na zrobienie tego w * nix, dostaniesz rzeczy, na których nie zależy (np. Ostrzeżenia :: register itp.), Ale powinno dać ci listę wszystkich plików .pm, które są dostępne przez perl.


for my $path (@INC) {
    my @list = `ls -R $path/**/*.pm`;
    for (@list) {
        s/$path\///g;
        s/\//::/g;
        s/\.pm$//g;
        print;
    }
}

półka
źródło
2
To nie da mu tego, czego chce. Nie grupuje powiązanych plików według dystrybucji, której są częścią, i wyświetli listę wszystkich podstawowych plików * .pm z samego Perla.
rjray
7
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'
zabity przez lucyfera
źródło
Jest to bardzo dobre, ponieważ wyraźnie pokazuje pełną ścieżkę do każdego *.pmmodułu. Możesz zobaczyć wiele duplikatów ...
not2qubit
7

Możesz uzyskać listę modułów perla zainstalowanych w twoim systemie za pomocą instmodshpolecenia w terminalu, który zapyta cię o trzy opcje, aby zwiększyć wydajność, którą są:

   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program
Thiyagu ATR
źródło
5

W systemie Linux / Unix używam tego prostego polecenia:

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

Skanuje cały folder @INCi szuka dowolnego pliku * .pm.

Wernfried Domscheit
źródło
Dziękuję Ci! Bardzo przydatne.
not2qubit
Dziękuję Ci! To chyba najbardziej perl, jakiego kiedykolwiek nauczyłem się, używając tak zwięzłego wyrażenia.
ewd
4

Wypróbuj następujące polecenie

instmodsh

user2024286
źródło
Najprostsza odpowiedź. Działa dobrze na naszym starożytnym serwerze Debian 6.
Dave Everitt
2

Spróbuj man perllocallub perldoc perllocal.

Walter H.
źródło
1

Właśnie wczoraj napisałem skrypt w Perlu, żeby to zrobić. Skrypt zwraca listę modułów perla zainstalowanych w @INC, używając znaku „::” jako separatora. Wywołaj skrypt za pomocą -

perl perlmod.pl

LUB

perl perlmod.pl <module name> #Case-insensitive(eg. perl perlmod.pl ftp)

W tej chwili skrypt pomija bieżący katalog („.”), Ponieważ miałem problemy z cyklicznymi linkami programowymi, ale możesz go dołączyć, zmieniając funkcję grep w linii 17 z

  grep { $_ !~ '^\.$' } @INC

po prostu,

@INC

Skrypt można znaleźć tutaj.

aks
źródło
1

Aby przejść przez drzewa katalogów @INC bez użycia zewnętrznego programu, takiego jak ls (1), można użyć File::Find::Rulemodułu, który ma ładny deklaratywny interfejs.

Ponadto chcesz odfiltrować duplikaty w przypadku, gdy poprzednie wersje Perla zawierają te same moduły. Kod do tego wygląda następująco:

#! /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}++;
    }
}

Pod koniec uruchomienia masz również wszystkie nazwy modułów jako klucze w hashu% seen. Kod można dostosować tak, aby zapisywał kanoniczną nazwę pliku (podaną w $ file) jako wartość klucza zamiast liczby widzianych razy.

dland
źródło
1

Poniższe zadziałały dla mnie.

$ perldoc perllocal | grep Module
$ perldoc perllocal | grep -E 'VERSION|Module'
caot
źródło
1

Wszyscy, którzy nie mogą zainstalować perldoc lub innych modułów i chcą wiedzieć, jakie moduły są dostępne (CPAN lub inne), poniższe działa dla linuxa i Mingw32 / 64:

grep -RhIP '^package [A-Z][\w:]+;' `perl -e 'print join " ",@INC'` | sed 's/package //' | sort | uniq

Tak, jest brudny. Tak, prawdopodobnie zgłasza więcej niż chcesz. Ale jeśli umieścisz to potokowo w pliku, możesz łatwo sprawdzić, na przykład, które interfejsy dbm są obecne:

 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;

Dlatego znalazłem się na tej stronie (rozczarowany)

(Zdaję sobie sprawę, że to nie odpowiada dokładnie na pytanie OP, ale wysyłam je dla każdego, kto trafił tutaj z tego samego powodu co ja. To jest problem ze stosem *** jest prawie niemożliwe, aby znaleźć pytanie, pytając, nawet jeśli istnieje, ale stack *** jest prawie zawsze największym hitem Google!)

user2967328
źródło
To zadziałało dla mnie. Dzięki za opublikowanie tego. Potrzebowałem tego w środowisku, w którym nie mam dużego dostępu do instalowania / aktualizowania jakichkolwiek zależności.
Ashish Kumar
0

książka kucharska Perla zawiera kilka iteracji skryptu „pmdesc”, który robi to, co chcesz. Wyszukaj w Google „Perl Cookbook pmdesc”, a znajdziesz artykuły na innych stronach z pytaniami i odpowiedziami , kilka list kodów w sieci, omówienie rozwiązania, a nawet pewne udoskonalenia .

knb
źródło
0

Oto jednowierszowy Perl, który wydrukuje listę zainstalowanych modułów:

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

Upewnij się tylko, że masz zainstalowany Data :: Dumper.

thealexbaron
źródło
2
Zawiera tylko około 15 modułów Perla, zamiast 5945 wymienionych przez „cpan -l”.
Paul Tomblin,
0
cd /the/lib/dir/of/your/perl/installation
perldoc $(find . -name perllocal.pod)

Użytkownicy systemu Windows po prostu wyszukują go w Eksploratorze Windows, aby go znaleźć.

mpersico
źródło
0

Spróbuj „perldoc -l”:

$ perldoc -l Log :: Dispatch /usr/local/share/perl/5.26.1/Log/Dispatch.pm

Paul Sun
źródło
0

Oto skrypt autorstwa @ JamesThomasMoon1979 przepisany jako jednolinijkowy

perl -MExtUtils::Installed -e '$i=ExtUtils::Installed->new(); 
      print "$_ ".$i->version($_)."\n" for $i->modules();'
Nicholas Sushkin
źródło
-1

Gdy wchodzisz do swojego skryptu Perl, masz wszystkie zainstalowane moduły jako pliki .pm poniżej folderów w @INC, więc mały skrypt bash wykona zadanie za Ciebie:

#!/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
Henrik
źródło
Dlaczego nie? find `perl -le'print for@INC'` -name '*.pm'
Hynek -Pichi- Vychodil
-2

W przypadku Linuksa najłatwiejszym sposobem jest uzyskanie

dpkg -l | grep "perl"
Yasiru G
źródło
1
OP poprosił o listę modułów CPAN (perl) zainstalowanych w systemie, a nie jeśli perl jest zainstalowany w systemie (ani OP nie powiedział nam, czy apt jest dostępny)
ROLO
Nie jestem ekspertem od Perla, ale widziałem zainstalowane moduły Perla z powyższego polecenia. Może nie jest to idealna odpowiedź.
Yasiru G
-2

To działa dla mnie

perl -e 'print join("\n",@INC,"")'
AnandiG
źródło
Dziękujemy za ten fragment kodu, który może zapewnić ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie byłoby znacznie poprawić swoją długoterminową wartość pokazując dlaczego jest to dobre rozwiązanie problemu, a byłoby bardziej użyteczne dla czytelników przyszłości z innymi, podobnymi pytaniami. Proszę edytować swoją odpowiedź dodać kilka wyjaśnień, w tym założeń już wykonanych.
Machavity
-3

Oto co robię: perl -M{cpan_module}
Jeśli nie pojawiły się żadne błędy, istnieje duża szansa, że ​​moduł został zainstalowany.

Craig McMillon
źródło
2
Nie wierzę, że to odpowiada na pytanie. Korzystając z tej sugestii, może minąć trochę czasu, zanim ktoś przejdzie moduł po module, aby odkryć, które moduły są zainstalowane, a które nie.
Dave Newman