¿Cómo obtengo una lista de los módulos CPAN instalados?


88

Aparte de intentar

perldoc <module name>

individualmente para cualquier módulo CPAN que me guste o pasando por el sistema de archivos y mirando los directorios no tengo idea de qué módulos tenemos instalados.

¿Cuál es la forma más sencilla de obtener una gran lista de todos los módulos CPAN instalados? Desde la línea de comando o de otra manera.


Puedo sugerir el uso de pmtools , especialmente pminst que acepta expresiones regulares.
lukmdo

perl-pmtools es una buena herramienta para usted.
jaseywang

¿Quieres saber qué módulos están instalados o qué distribuciones están instaladas?
Tim Bunce

4
Me resultó cpan -lútil en Windows.
anulado el

1
Esto podría ser útil:instmodsh
Ravi

Respuestas:


65

Esto se responde en las preguntas frecuentes de Perl, la respuesta que se puede encontrar rápidamente con perldoc -q installed. En resumen, se trata de usar ExtUtils::Installedo usar File::Findvariantes de ambos que se han tratado anteriormente en este hilo.

También puede encontrar la entrada de preguntas frecuentes "¿Cómo encuentro qué módulos están instalados en mi sistema?" en perlfaq3. Puede ver una lista de todas las respuestas a las preguntas frecuentes si busca en perlfaq


36
Esto da mucho más de lo que pidió el OP que es prácticamente inútil.
Justin

2
cpan -l está haciendo una búsqueda recursiva de cualquier directorio desde el que lo ejecute. ¿Hay alguna forma de pasar la opción del ExtUtils::Installedconstructor skip_cwddesde esa línea de comando?
Mark Reed

10
Las preguntas frecuentes dicen usar cpan -lpero eso no funciona en RHEL6 y /usr/bin/cpan -larroja el error Unknown option: l.
Stefan Lasiewski

1
$ perldoc perllocal | Módulo grep $ perldoc perllocal | grep -E 'VERSION | Módulo'
caot

use perldoc -t perllocal para obtener una salida de texto sin formato; de lo contrario, es posible que grep no funcione debido a los caracteres ctrl integrados
user333869

35
perldoc perllocal

Editar: hay (un poco) más de información al respecto en las preguntas frecuentes de CPAN


2
Gracias por el enlace a las preguntas frecuentes. Desafortunadamente, no todos los módulos que sé que están instalados están regresando. Date :: Calc ni siquiera aparece allí.
David McLaughlin

26

perldoc -q installed

afirma que funcionará cpan -l, sin embargo, no me funciona. La otra opción:

cpan -a

escupe una buena lista de paquetes instalados y tiene el agradable efecto secundario de escribirlos en un archivo.


2
Para el registro, cpan -lfunciona (o lo hace para mí con CPAN v2.05). cpan -aes de hecho más bonito.
William Turrell

23

Vale la pena señalar que perldoc perllocal solo informará sobre los módulos instalados a través de CPAN. Si alguien instala módulos manualmente, no los encontrará. Además, si tiene varias personas instalando módulos y perllocal.pod está bajo control de código fuente, la gente podría resolver los conflictos incorrectamente y corromper la lista (esto ha sucedido aquí en el trabajo, por ejemplo).

Lamentablemente, la solución parece ser recorrer @INC con File :: Find o algo similar. Sin embargo, eso no solo encuentra los módulos, también encuentra módulos relacionados en una distribución. Por ejemplo, informaría TAP :: Harness y TAP :: Parser además del nombre de distribución real de Test :: Harness (asumiendo que tiene la versión 3 o superior). Potencialmente, podría emparejarlos con nombres de distribución y descartar aquellos nombres que no coincidan, pero luego podría estar descartando módulos construidos e instalados localmente.

Creo que se supone que el trabajo de indexación de backpan de brian d foy tiene código para entregarlo en el archivo .pm e intentará inferir la distribución, pero incluso esto falla a veces porque lo que hay en un paquete no está necesariamente instalado (ver Devel :: Cover :: Inc por ejemplo).


1
No creo que necesite sacar el catálogo de armas de BackPAN para ese. Algo como lo que hago con Test :: Prereq para colapsarlo por la distribución que encuentra en 02packages podría ser suficiente. Sin embargo, eso es un poco más complicado que simplemente enumerar los archivos del módulo, y el catálogo aún no está cerca de manejar eso.
Brian D Foy

2
A partir de una prueba rudimentaria (haciendo un "make -n install" en algunos directorios que tengo por ahí), el paso "make install" de cualquier módulo basado en MakeMaker actualizará perllocal. No es específico para la instalación a través de CPAN directamente.
rjray

1
Creo que Dist :: Surveyor sigue siendo la mejor herramienta para responder a la pregunta "¿qué distribuciones están instaladas en esa biblioteca?". Consulte esta presentación para obtener más detalles. Hay una versión fatpacked fácil de usar en el repositorio de 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
esto funciona muy bien para aquellos de nosotros que no tenemos cpan instalado.
pdwalker

Respuesta realmente subestimada. Esto también funciona para distribuciones RHEL.
Cristina

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

Me llevó más tiempo de lo que esperaba (unos 20 segundos más o menos en mi máquina), ¡pero funcionó a la perfección! Gran respuesta.
Hans Goldman

19

Puede probar ExtUtils-Installed , pero eso solo se ve en .packlists, por lo que puede perder módulos a los que las personas movieron cosas@INC mano.

Escribí App-Module-Lister para un amigo que quería hacer esto como un script CGI en una cuenta de alojamiento web que no fuera shell. Simplemente tome el archivo del módulo y cárguelo como un nombre de archivo que su servidor tratará como un script CGI. No tiene dependencias fuera de la biblioteca estándar. Úselo tal cual o robe el código.

Genera una lista de los módulos y sus versiones:

Empate :: Ciclo 1,15
Corbata :: IxHash 1.21
Corbata :: Alternar 1.07
Empate :: ToObject 0.03
Hora: CTime 99.062201
Tiempo :: DaysInMonth 99.1117
Tiempo :: Época 0.02
Tiempo :: Fuzzy 0.34
Hora: JulianDay 2003.1125
Hora :: ParseDate 2006.0814
Hora :: Zona horaria 2006.0814

He querido agregar esto como una función a la cpanherramienta, así que también lo haré. [El tiempo pasa] Y ahora tengo un -linterruptor cpan. Tengo algunas otras cosas que hacer con él antes de hacer un lanzamiento, pero está en github . Si no quiere esperar por eso, puede probar el -ainterruptor para crear un paquete automático, aunque eso pone algo de Pod en la lista.

Buena suerte;


12

Aquí un guión que haría el truco:

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

En RHEL 6.9, este script solo imprime lo siguiente: Los Perl - 5.10.1 módulos no se enumeran.
Hans Deragon

9

Me gusta usar el comando CPAN 'r' para esto. Puede ingresar al shell CPAN con el estilo antiguo:

sudo perl -MCPAN -e shell

o, en la mayoría de los sistemas más nuevos, hay un comando 'cpan', por lo que este comando lo llevará al shell:

sudo cpan

(Por lo general, debe usar 'sudo' para ejecutarlo como root, o usar 'su -' para convertirse en root antes de ejecutarlo, a menos que tenga cpan configurado para permitirle ejecutarlo como un usuario normal, pero instalarlo como root. Si no tiene root en esta máquina, aún puede usar el shell de CPAN para encontrar esta información, pero no podrá instalar módulos y es posible que deba realizar un poco de configuración la primera vez que ejecutarlo.)

Luego, una vez que esté en el shell cpan, puede usar el comando 'r' para informar todos los módulos instalados y sus versiones. Entonces, en el indicador "cpan>", escriba 'r'. Esto mostrará una lista de todos los módulos instalados y sus versiones. Utilizar '?' para obtener más ayuda.


1
en realidad, 'r' le da las recomendaciones de reinstalación, es decir, todos los módulos de su instalación que tienen una versión más reciente de CPAN. A menos que su instalación esté muy desactualizada, esta no será una lista completa.
EvdB

Mi 'r' siempre informa casi nada porque actualizo compulsivamente. Lo que me recuerda ... todavía no me he actualizado.
skiphoppy

3
El -r recompila cosas. Para obtener una lista, pruebe -a o descargue las últimas fuentes y juegue con el nuevo modificador -l, agregado solo para esta respuesta. :)
brian d foy

1
¿Por qué el sudoaquí? Es completamente innecesario.
Aristóteles Pagaltzis

2
observe la diferencia entre el argumento de la línea de comandos '-r' para 'cpan' y el comando 'r' en el shell cpan :)
EvdB

7

Aquí hay una forma realmente peligrosa de hacerlo en * nix, obtendrá algunas cosas que realmente no le importan (es decir: advertencias :: registrarse, etc.), pero debería darle una lista de todos los archivos .pm a los que se puede acceder a través de perl.


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


2
Esto no le dará lo que quiere. No agrupará los archivos relacionados por la distribución de la que forman parte, y enumerará todos los archivos * .pm principales de Perl.
rjray

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

Esto es muy bueno ya que muestra claramente la ruta completa a cada *.pmmódulo. Es posible que vea muchos duplicados ...
not2qubit

7

Puede obtener una lista de los módulos perl instalados en su sistema usando el instmodshcomando en su terminal. Le pedirá tres opciones para mejorar la salida que son:

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

5

En Linux / Unix utilizo este sencillo comando:

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

Escanea todas las carpetas @INCy busca cualquier archivo * .pm.


¡Gracias! Muy útil.
not2qubit

¡Gracias! Eso es quizás lo más perl que me han enseñado con una expresión tan sucinta.
ewd




1

Ayer mismo escribí un script en Perl para hacer exactamente esto. El script devuelve la lista de módulos perl instalados en @INC usando '::' como separador. Llame al script usando -

perl perlmod.pl

O

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

A partir de ahora, el script omite el directorio actual ('.') Ya que estaba teniendo problemas con la recursión de enlaces suaves, pero puede incluirlo cambiando la función grep en la línea 17 de

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

para sólo,

@INC

El guión se puede encontrar aquí.



1

Para recorrer los árboles del directorio @INC sin usar un programa externo como ls (1), se podría usar el File::Find::Rule módulo, que tiene una bonita interfaz declarativa.

Además, desea filtrar los duplicados en caso de que las versiones anteriores de Perl contengan los mismos módulos. El código para hacer esto se ve así:

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

Al final de la ejecución, también tiene todos los nombres de sus módulos como claves en el% de hash visto. El código podría adaptarse para guardar el nombre de archivo canónico (dado en $ file) como el valor de la clave en lugar de un recuento de veces visto.


1

Lo siguiente funcionó para mí.

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

1

Todos aquellos que no puedan instalar perldoc u otros módulos y quieran saber qué módulos están disponibles (CPAN o de otro tipo), lo siguiente funciona para Linux y Mingw32 / 64:

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

Sí, es desordenado. Sí, probablemente informe más de lo que desea. Pero si lo canaliza a un archivo, puede verificar fácilmente, por ejemplo, qué interfaces dbm están presentes:

 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;

Por eso terminé en esta página (decepcionado)

(Me doy cuenta de que esto no responde exactamente a la pregunta del OP, pero lo estoy publicando para cualquiera que haya terminado aquí por la misma razón que yo. Ese es el problema con la pila ***, es casi imposible encontrar la pregunta que estás preguntando, incluso cuando existe, ¡pero stack *** es casi siempre el mayor éxito de Google!


Esto funcionó para mí. Gracias por publicar esto. Necesitaba esto en un entorno donde no tengo mucho acceso para instalar / actualizar ninguna dependencia.
Ashish Kumar


0

Aquí hay un resumen de Perl que imprimirá una lista de módulos instalados:

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

Solo asegúrate de tener Data :: Dumper instalado.


2
Esto solo enumera unos 15 módulos perl, en lugar del 5945 que enumera 'cpan -l'.
Paul Tomblin

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

Los usuarios de Windows simplemente realizan una búsqueda en el Explorador de Windows para encontrarlo.


0

Prueba "perldoc -l":

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


0

Aquí hay un guión de @ JamesThomasMoon1979 reescrito como una sola línea

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

-1

A medida que ingresa su script Perl, tiene todos los módulos instalados como archivos .pm debajo de las carpetas en @INC, por lo que un pequeño script bash hará el trabajo por usted:

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

Por qué no? find `perl -le'print for@INC'` -name '*.pm'
Hynek -Pichi- Vychodil

-2

Para Linux, la forma más fácil de conseguirlo es,

dpkg -l | grep "perl"

1
el OP solicitó una lista de módulos CPAN (perl) instalados en el sistema, no si perl está instalado en el sistema (ni el OP nos dijo si apt está disponible)
ROLO

No soy un experto en perl pero he visto módulos de perl instalados desde el comando anterior. Puede que no sea la respuesta perfecta aquí.
Yasiru G


-3

Esto es lo que hago: perl -M{cpan_module}
si no recibe ningún error, es muy probable que el módulo esté instalado.


2
No creo que esto responda a la pregunta. Con esta sugerencia, a alguien podría llevarle un tiempo revisar módulo por módulo para descubrir qué módulos están instalados o no.
Dave Newman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.