¿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.

David McLaughlin
fuente
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

pjf
fuente
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

Dan
fuente
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.

Paul Rubel
fuente
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).

Ovidio
fuente
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"
Dan
fuente
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;

Brian D Foy
fuente
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
Joakim
fuente
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.

amoore
fuente
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;
    }
}

Shelfoo
fuente
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'
slayedbylucifer
fuente
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
Thiyagu ATR
fuente
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.

Wernfried Domscheit
fuente
¡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
4

Prueba el siguiente comando

instmodsh

user2024286
fuente
Respuesta más simple. Funcionó bien en nuestro antiguo servidor Debian 6.
Dave Everitt
2

Prueba man perllocalo perldoc perllocal.

Walter H
fuente
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í.

aks
fuente
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.

dland
fuente
1

Lo siguiente funcionó para mí.

$ perldoc perllocal | grep Module
$ perldoc perllocal | grep -E 'VERSION|Module'
caot
fuente
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!

usuario2967328
fuente
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.

thealexbaron
fuente
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.

mpersico
fuente
0

Prueba "perldoc -l":

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

Paul Sun
fuente
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();'
Nicholas Sushkin
fuente
-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
Henrik
fuente
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"
Yasiru G
fuente
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
-2

Esto funciona para mi

perl -e 'print join("\n",@INC,"")'
AnandiG
fuente
Gracias por este fragmento de código, que puede proporcionar ayuda inmediata y limitada. Una explicación adecuada mejoraría enormemente su valor a largo plazo al mostrar por qué es una buena solución al problema y lo haría más útil para futuros lectores con otras preguntas similares. Por favor, editar su respuesta a añadir un poco de explicación, incluyendo los supuestos realizados.
Machavity
-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.

Craig McMillon
fuente
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