perl - pagina - ¿Cómo obtengo una lista de módulos de CPAN instalados?
perl package manager (26)
Al ingresar su secuencia de comandos de 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
Aparte de intentar
perldoc <module name>
individualmente para cualquier módulo de CPAN que me apetezca o pase por el sistema de archivos y mirando los directorios, no tengo idea de qué módulos hemos instalado.
¿Cuál es la forma más fácil de obtener una gran lista de todos los módulos de CPAN instalados? Desde la línea de comando o de lo contrario.
Aquí hay otra herramienta de línea de comandos para listar todos los archivos .pm instalados:
Encuentra módulos Perl instalados que coincidan con una expresión regular
- Portátil (solo usa módulos centrales)
- Opción de caché para búsquedas más rápidas
- Opciones de visualización configurables
Aquí hay un trazador de líneas 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 instalado Data :: Dumper.
Aquí hay una manera realmente chistosa de hacerlo en * nix, obtendrá algunas cosas que realmente no le importan (es decir, advertencias :: registro, etc.), pero debería darle una lista de cada archivo .pm al 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;
}
}
Aquí un script 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
Escribí un script de perl ayer para hacer exactamente esto. El script devuelve la lista de módulos perl instalados en @INC utilizando el ''::'' como separador. Llamar al script usando -
perl perlmod.pl
O
perl perlmod.pl <module name> #Case-insensitive(eg. perl perlmod.pl ftp)
A partir de ahora, el guión se salta el directorio actual (''.'') Ya que estaba teniendo problemas con la recurrencia de soft-links, pero puede incluirlo cambiando la función grep en la línea 17 de
grep { $_ !~ ''^/.$'' } @INC
para sólo,
@INC
El script se puede encontrar here.
Esto es lo que hago: perl -M{cpan_module}
Si no recibe ningún error, existe una buena posibilidad de que el módulo esté instalado.
Esto funciona para mí
perl -e ''print join("/n",@INC,"")''
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::Installed
o usar File::Find
, variantes de los cuales se han cubierto anteriormente en este hilo.
También puede encontrar la entrada de preguntas frecuentes "¿Cómo puedo encontrar qué módulos están instalados en mi sistema?" en perlfaq3. Puede ver una lista de todas las respuestas a las preguntas frecuentes al buscar en perlfaq
La respuesta se puede encontrar en la lista de Preguntas frecuentes de Perl .
Debería leer la excelente documentación que viene con Perl
perldoc perltoc
Lo siguiente funcionó para mí.
$ perldoc perllocal | grep Module
$ perldoc perllocal | grep -E ''VERSION|Module''
Me gusta usar el comando CPAN ''r'' para esto. Puede acceder al shell CPAN con el estilo anterior:
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 te 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 configurado el cpan para que pueda ejecutarlo como un usuario normal, pero instálelo como root. Si no tiene root en esta máquina, puede seguir usando el shell CPAN para averiguar 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 reportar todos los módulos instalados y sus versiones. Por lo tanto, en el mensaje "cpan>", escriba ''r''. Esto mostrará una lista de todos los módulos instalados y sus versiones. Utilizar ''?'' para obtener un poco más de ayuda.
Para Linux, la manera más fácil de obtener es
dpkg -l | grep "perl"
Para recorrer los árboles del directorio @INC sin usar un programa externo como ls (1), se podría usar el File::Find::Rule
, que tiene una buena 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 los módulos como claves en el% 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 conteo de veces visto.
Prueba el siguiente comando
instmodsh
Pruebe man perllocal
o perldoc perllocal
.
Puede obtener una lista de los módulos Perl instalados en su sistema mediante el uso del comando instmodsh
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
Puede probar ExtUtils-Installed , pero eso solo se ve en .packlist
s, por lo que puede perder módulos que las personas movieron cosas en @INC
a mano.
Escribí App-Module-Lister para un amigo que quería hacer esto como un script CGI en una cuenta de alojamiento web sin 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.
Muestra una lista de los módulos y sus versiones:
Tie::Cycle 1.15 Tie::IxHash 1.21 Tie::Toggle 1.07 Tie::ToObject 0.03 Time::CTime 99.062201 Time::DaysInMonth 99.1117 Time::Epoch 0.02 Time::Fuzzy 0.34 Time::JulianDay 2003.1125 Time::ParseDate 2006.0814 Time::Timezone 2006.0814
He tenido la intención de agregar esto como una característica de la herramienta cpan
, así que también lo haré. [El tiempo pasa] Y ahora tengo un interruptor -l
en cpan
. Tengo algunas otras cosas que ver con esto antes de lanzar, pero está en github . Si no quieres esperar, puedes probar el interruptor -a
para crear una autobundle, aunque eso pone un Pod alrededor de la lista.
Buena suerte;
Use perldoc -q instalado para obtener más información o simplemente escriba
perldoc <Module::Name>
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 el perllocal.pod está bajo control de fuente, las personas podrían resolver los conflictos de manera incorrecta y corromper la lista (esto ha sucedido aquí en el trabajo, por ejemplo).
Lamentablemente, la solución parece estar caminando a través de @INC con File :: Find o algo similar. Sin embargo, eso no solo busca los módulos, también encuentra módulos relacionados en una distribución. Por ejemplo, reportaría TAP :: Harness y TAP :: Parser además del nombre real de distribución de Test :: Harness (suponiendo que tiene la versión 3 o superior). Podría combinarlos con nombres de distribución y descartar aquellos nombres que no coinciden, pero entonces podría estar descartando módulos localmente construidos e instalados.
Creo que se supone que el trabajo de indexación de backpen de Brian tiene un código para entregarlo en el archivo .pm e intentará inferir la distribución, pero incluso esto falla a veces porque lo que está en un paquete no está necesariamente instalado (ver Devel :: Portada :: Inc por ejemplo).
el libro de cocina de Perl contiene varias iteraciones de un script "pmdesc" que hace lo que usted desea. Google-busque "Perl Cookbook pmdesc" y encontrará artículos en otros sitios de preguntas y respuestas , varias listas de códigos en la red, una discusión de la solución e incluso algunos refinamientos .
perldoc -q installed
afirma que cpan -l
hará el truco, sin embargo, no funciona para mí. La otra opción:
cpan -a
escupió una buena lista de paquetes instalados y tiene el bonito efecto secundario de escribirlos en un archivo.
$ 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"
cd /the/lib/dir/of/your/perl/installation
perldoc $(find . -name perllocal.pod)
Los usuarios de Windows simplemente hacen una búsqueda de Windows Explorer para encontrarlo.
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe ''find { wanted => sub { print canonpath $_ if //.pm/z/ }, no_chdir => 1 }, @INC''
perldoc perllocal
Editar: Hay un (poco) más información al respecto en las preguntas frecuentes de CPAN