Come posso ottenere un elenco dei moduli CPAN installati?


88

A parte provare

perldoc <module name>

individualmente per qualsiasi modulo CPAN che mi piaccia o passando attraverso il file system e guardando le directory non ho idea di quali moduli abbiamo installato.

Qual è il modo più semplice per ottenere un ampio elenco di ogni modulo CPAN installato? Dalla riga di comando o in altro modo.


Posso suggerire di usare pmtools , specialmente pminst che accetta espressioni regolari.
lukmdo

perl-pmtools è il buon strumento per te.
jaseywang

Vuoi sapere quali moduli sono installati o quali distribuzioni sono installate?
Tim Bunce,

4
Ho trovato cpan -lutile per me stesso su Windows.
void

1
Questo potrebbe essere utile:instmodsh
Ravi

Risposte:


65

Questa è una risposta nelle FAQ di Perl, la risposta che può essere trovata rapidamente con perldoc -q installed. In breve, si tratta di utilizzare ExtUtils::Installedo utilizzare File::Find, varianti di entrambi sono state trattate in precedenza in questo thread.

È inoltre possibile trovare la voce FAQ "Come faccio a trovare i moduli installati sul mio sistema?" in perlfaq3. Puoi vedere un elenco di tutte le risposte alle FAQ cercando in perlfaq


36
Questo dà molto di più di quanto richiesto dall'OP che è praticamente inutile.
Justin

2
cpan -l sta eseguendo una ricerca ricorsiva in qualsiasi directory da cui lo esegua. C'è un modo per passare l' opzione ExtUtils::Installeddel costruttore skip_cwdda quella riga di comando?
Mark Reed

10
La FAQ dice di usare cpan -lma questo non funziona su RHEL6 e /usr/bin/cpan -lgenera l'errore Unknown option: l.
Stefan Lasiewski

1
$ perldoc perllocal | Modulo grep $ perldoc perllocal | grep -E 'VERSION | Module'
caot

usa perldoc -t perllocal per ottenere un output di testo normale, altrimenti grep potrebbe non funzionare a causa dei caratteri ctrl incorporati
user333869

35
perldoc perllocal

Modifica: ci sono (un po ') più informazioni a riguardo nelle domande frequenti su CPAN


2
Grazie per il link alle FAQ. Sfortunatamente non tutti i moduli che so essere installati stanno tornando. Data :: Calc non compare nemmeno lì.
David McLaughlin,

26

perldoc -q installed

afferma che cpan -lfarà il trucco, tuttavia non funziona per me. L'altra opzione:

cpan -a

sputa una bella lista di pacchetti installati e ha il piacevole effetto collaterale di scriverli su un file.


2
Per la cronaca, cpan -lfunziona (o funziona per me con CPAN v2.05). cpan -aè davvero più carina.
William Turrell

23

Vale la pena notare che perldoc perllocal riporterà solo i moduli installati tramite CPAN. Se qualcuno installa i moduli manualmente, non li troverà. Inoltre, se più persone installano moduli e perllocal.pod è sotto il controllo del codice sorgente, le persone potrebbero risolvere i conflitti in modo errato e corrompere l'elenco (questo è accaduto qui al lavoro, per esempio).

Purtroppo, la soluzione sembra passare attraverso @INC con File :: Find o qualcosa di simile. Tuttavia, questo non trova solo i moduli, ma trova anche i moduli correlati in una distribuzione. Ad esempio, segnalerà TAP :: Harness e TAP :: Parser oltre al nome di distribuzione effettivo di Test :: Harness (supponendo che tu abbia la versione 3 o successiva). Potresti potenzialmente abbinarli ai nomi delle distribuzioni e scartare quei nomi che non corrispondono, ma potresti scartare i moduli costruiti e installati localmente.

Credo che il lavoro di indicizzazione del backpan di brian d foy dovrebbe avere il codice per consegnarlo nel file .pm e tenterà di dedurre la distribuzione, ma anche questo a volte fallisce perché ciò che è in un pacchetto non è necessariamente installato (vedi Develop :: Cover :: Inc per un esempio).


1
Non penso di aver bisogno di estrarre le pistole del catalogo BackPAN per quello. Qualcosa di simile a Test :: Prereq per comprimerlo in base alla distribuzione che trova in 02packages potrebbe essere sufficiente. Questo è un po 'più complicato del semplice elencare i file del modulo, e il catalogo non è ancora vicino a gestirlo.
brian d foy

2
Da un test rudimentale (facendo un "make -n install" in alcune directory che ho in giro), il passaggio "make install" di qualsiasi modulo basato su MakeMaker aggiornerà perllocal. Non è specifico per l'installazione tramite CPAN direttamente.
rjray

1
Penso che Dist :: Surveyor sia ancora lo strumento migliore per rispondere alla domanda "quali distribuzioni sono installate in quella libreria?". Vedi questa presentazione per maggiori dettagli. C'è una versione fatpacked facile da usare nel repository git .
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"

2
questo funziona bene per quelli di noi che non hanno installato cpan.
pdwalker

Risposta davvero sottovalutata. Questo funziona anche per le distribuzioni RHEL.
Cristina

4
Ho ricevuto:No documentation found for "perllocal".
Luis A. Florit

Ci è voluto più tempo di quanto mi aspettassi (circa 20 secondi circa sulla mia macchina), ma ha funzionato perfettamente! Bella risposta.
Hans Goldman

19

Puoi provare ExtUtils-Installed , ma guarda solo in .packlists, quindi potrebbero mancare i moduli in cui le persone hanno spostato le cose a @INCmano.

Ho scritto App-Module-Lister per un amico che voleva farlo come script CGI su un account di hosting web non shell. Prendi semplicemente il file del modulo e caricalo come un nome di file che il tuo server tratterà come uno script CGI. Non ha dipendenze al di fuori della libreria standard. Usalo così com'è o ruba il codice.

Emette un elenco dei moduli e delle loro versioni:

Pareggio :: Ciclo 1.15
Pareggio :: IxHash 1.21
Cravatta :: Toggle 1.07
Tie :: ToObject 0.03
Ora :: CTime 99.062201
Tempo :: DaysInMonth 99.1117
Tempo :: Epoca 0.02
Tempo :: Fuzzy 0,34
Tempo :: JulianDay 2003.1125
Ora :: ParseDate 2006.0814
Ora :: Fuso orario 2006.0814

Avevo intenzione di aggiungerlo come funzionalità allo cpanstrumento, quindi lo farò anche io. [Il tempo passa] E ora ho un -linterruttore cpan. Ho alcune altre cose da fare con esso prima di fare un rilascio, ma è in GitHub . Se non vuoi aspettare questo, puoi semplicemente provare l' -ainterruttore per creare un autobundle, anche se questo mette alcuni Pod nell'elenco.

In bocca al lupo;


12

Ecco uno script che farebbe il trucco:

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

In RHEL 6.9, questo script stampa solo quanto segue: I Perl - 5.10.1 moduli non sono elencati.
Hans Deragon

9

Mi piace usare il comando CPAN 'r' per questo. Puoi entrare nella shell CPAN con il vecchio stile:

sudo perl -MCPAN -e shell

oppure, sulla maggior parte dei sistemi più recenti, c'è un comando 'cpan', quindi questo comando ti porterà alla shell:

sudo cpan

(Normalmente devi usare 'sudo' per eseguirlo come root, o usare 'su -' per diventare root prima di eseguirlo, a meno che tu non abbia impostato cpan per eseguirlo come un utente normale, ma installarlo come root. Se non hai il root su questa macchina, puoi comunque usare la shell CPAN per trovare queste informazioni, ma non sarai in grado di installare i moduli e potresti dover eseguire un po 'di configurazione la prima volta che eseguirlo.)

Quindi, una volta che sei nella shell cpan, puoi usare il comando "r" per segnalare tutti i moduli installati e le loro versioni. Quindi, al prompt "cpan>", digita "r". Questo elencherà tutti i moduli installati e le loro versioni. Uso '?' per avere più aiuto.


1
in realtà "r" ti dà i consigli per la reinstallazione, cioè tutti i moduli sulla tua installazione che hanno una versione più recente di CPAN. A meno che la tua installazione non sia molto aggiornata, questo non sarà un elenco completo.
EvdB

La mia "r" riporta sempre quasi nulla perché aggiorno compulsivamente. Il che mi ricorda ... non ho ancora aggiornato oggi.
skiphoppy

3
-R ricompila le cose. Per ottenere un elenco, prova -a o scarica le fonti più recenti e gioca con il nuovo interruttore -l, aggiunto solo per questa risposta. :)
brian d foy

1
Perché sudoqui? È completamente inutile.
Aristotele Pagaltzis

2
nota la differenza tra l'argomento della riga di comando "-r" in "cpan" e il comando "r" nella shell cpan :)
EvdB

7

Ecco un modo davvero hacky per farlo in * nix, otterrai alcune cose che non ti interessano davvero (ad esempio: warnings :: register ecc.), Ma dovrebbe darti un elenco di tutti i file .pm accessibili tramite perl.


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


2
Questo non gli darà quello che vuole. Non raggrupperà i file correlati in base alla distribuzione di cui fanno parte, e elencherà tutti i file * .pm principali dallo stesso Perl.
rjray

7
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'

Questo è molto buono in quanto mostra chiaramente il percorso completo di ciascun *.pmmodulo. Potresti vedere molti duplicati ...
not2qubit

7

Puoi ottenere l'elenco dei moduli perl installati nel tuo sistema usando il instmodshcomando nel tuo terminale. Ti chiederanno tre opzioni per migliorare l'output che sono:

   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program

5

Su Linux / Unix utilizzo questo semplice comando:

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

Esegue la scansione di tutte le cartelle @INCe cerca qualsiasi file * .pm.


Grazie! Molto utile.
not2qubit il

Grazie! Questo è forse il più perl che mi sia mai stato insegnato con un'espressione così succinta.
ewd


2

La risposta può essere trovata nell'elenco delle FAQ di Perl .

Dovresti dare un'occhiata all'eccellente documentazione fornita con Perl

perldoc perltoc


1

Ho scritto uno script perl proprio ieri per fare esattamente questo. Lo script restituisce l'elenco dei moduli perl installati in @INC utilizzando "::" come separatore. Chiama lo script usando -

perl perlmod.pl

O

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

A partire da ora lo script salta la directory corrente ('.') Poiché avevo problemi con i soft-link ricorrenti ma puoi includerlo cambiando la funzione grep nella riga 17 da

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

solo per,

@INC

Lo script può essere trovato qui.



1

Per esplorare gli alberi di directory @INC senza usare un programma esterno come ls (1), si potrebbe usare il File::Find::Rulemodulo, che ha una bella interfaccia dichiarativa.

Inoltre, si desidera filtrare i duplicati nel caso in cui le versioni precedenti di Perl contengano gli stessi moduli. Il codice per farlo è simile a:

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

Alla fine della corsa, hai anche tutti i nomi dei tuoi moduli come chiavi nell'hash% seen. Il codice potrebbe essere adattato per salvare il nome del file canonico (dato in $ file) come valore della chiave invece di un conteggio di volte visto.


1

Quanto segue ha funzionato per me.

$ perldoc perllocal | grep Module
$ perldoc perllocal | grep -E 'VERSION|Module'

1

Tutti coloro che non possono installare perldoc, o altri moduli, e vogliono sapere quali moduli sono disponibili (CPAN o altro), funziona quanto segue per Linux e Mingw32 / 64:

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

Sì, è disordinato. Sì, probabilmente riporta più di quanto desideri. Ma se lo inserisci in un file, puoi facilmente controllare, ad esempio, quali interfacce dbm sono presenti:

 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;

Ecco perché sono finito su questa pagina (deluso)

(Mi rendo conto che questo non risponde esattamente alla domanda dell'OP, ma lo sto pubblicando per chiunque sia finito qui per lo stesso motivo per cui l'ho fatto. Questo è il problema con lo stack *** è quasi impossibile trovare la domanda che stai chiedendo, anche quando esiste, ma lo stack *** è quasi sempre il miglior successo di Google!)


Questo ha funzionato per me. Grazie per aver postato questo. Ne avevo bisogno in un ambiente in cui non ho molto accesso per installare / aggiornare eventuali dipendenze.
Ashish Kumar


0

Ecco una riga di testo Perl che stamperà un elenco di moduli installati:

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

Assicurati solo di avere Data :: Dumper installato.


2
Questo elenca solo circa 15 moduli perl, invece dei 5945 elencati da 'cpan -l'.
Paul Tomblin

0
cd /the/lib/dir/of/your/perl/installation
perldoc $(find . -name perllocal.pod)

Gli utenti Windows eseguono semplicemente una ricerca in Esplora risorse per trovarlo.


0

Prova "perldoc -l":

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


0

Ecco una sceneggiatura di @ JamesThomasMoon1979 riscritta come una battuta

perl -MExtUtils::Installed -e '$i=ExtUtils::Installed->new(); 
      print "$_ ".$i->version($_)."\n" for $i->modules();'

-1

Quando inserisci il tuo script Perl, hai tutti i moduli installati come file .pm sotto le cartelle in @INC, quindi un piccolo script bash farà il lavoro per te:

#!/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

Perchè no? find `perl -le'print for@INC'` -name '*.pm'
Hynek -Pichi- Vychodil

-2

Per Linux il modo più semplice per ottenerlo è,

dpkg -l | grep "perl"

1
l'OP ha chiesto un elenco di moduli CPAN (perl) installati nel sistema, non se perl è installato nel sistema (né l'OP ci ha detto se apt è disponibile)
ROLO

Non sono un esperto di perl ma ho visto i moduli perl installati dal comando precedente. Potrebbe non essere la risposta perfetta qui.
Yasiru G


-3

Questo è quello che faccio: perl -M{cpan_module}
se non ricevi alcun errore, c'è una buona possibilità che il modulo sia installato.


2
Non credo che questo risponda alla domanda. Usando questo suggerimento, potrebbe volerci un po 'di tempo a qualcuno per passare attraverso modulo per modulo per scoprire quali moduli sono installati o meno.
Dave Newman
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.