2009-12-17 29 views
5

¿Existe alguna manera inteligente de detectar si se ha instalado cierto módulo Perl en su sistema? Mi vieja forma de sutpid es escribir un script de Perl en el que lo único que hago es simplemente usar el módulo. Si no funciona nada cuando ejecuto el script de detección, entonces sé que el módulo se ha instalado, aunque todavía no sé qué versión y dónde se ha instalado el módulo.¿Cómo puedo obtener la versión y la ubicación de un módulo Perl instalado?

gracias de antemano.

+1

Vea también http://stackoverflow.com/questions/135755/how-can-i-find-the-version-of-an-installed-perl-module – Ether

Respuesta

9

Algo así como:

perl -MModule -e 'print "$Module::VERSION\n"' 2>/dev/null || echo "Not installed" 

le daría la versión de un módulo dado, o decirle que no está instalado. El uso se vería así:

perl -MXML::Parser -e 'print "$XML::Parser::VERSION\n"' 2>/dev/null || echo "Not installed" 

Para encontrar la ruta del módulo, se puede examinar @INC para encontrar posibles lugares, o que tal vez podría mirar en perlwhich. También hay pmpath de pmtools.

+5

si está utilizando pmtools, luego [pminst] (http://search.cpan.org/~mlfisher/pmtools/pminst) muestra si un módulo está instalado, y [pmvers] (http://search.cpan.org/~mlfisher/pmtools/pmvers) muestra qué versión esta instalado. ('apt-get install pmtools' en Debian/Ubuntu) – plusplus

3

instmodsh

NAME 
     instmodsh - A shell to examine installed modules 

SYNOPSIS 
      instmodsh 

DESCRIPTION 
     A little interface to ExtUtils::Installed to examine installed modules, validate your packlists and even create a tarball from an installed module. 

SEE ALSO 
     ExtUtils::Installed 
+0

Es bueno saberlo, pero tenga en cuenta que los módulos _core_ no se enumeran por separado, sino más bien como archivos que pertenecen a un módulo abstracto simplemente llamado 'Perl'. Aparte de eso, el hecho de que 'instmodsh' es una _shell_ hace que sea un poco incómodo de usar, necesita varios pasos interactivos para obtener la información deseada, y aunque pude encontrar la _location_ de un módulo, parece que no hay manera de obtener la _version_. Por otro lado, usar el comando 'l' es una forma conveniente de ver todos los módulos no centrales (que pueden haber venido con una distribución particular o pueden haber sido instalados por el usuario más adelante). – mklement0

+0

Otra consideración: 'instmodsh' no encontrará los módulos que no se instalaron a través de los archivos' * .packlist'. – mklement0

1

No sé si hay alguna manera inteligente para esto. Pero lo que normalmente hago
es hacer uso de la opción '-l' o '-m' de perldoc. Por ejemplo:

%perldoc -l XML::Simple

y la salida es algo parecido a continuación, que es la ruta completa del archivo de módulo

.../lib/XML/Simple.pm 

La ventaja de este enfoque en comparación con la suya es que, si se ha instalado el módulo
la salida contiene la ruta para la ubicación del módulo. Sin embargo, cuando el módulo no está instalado
o si no tiene una perldoc el mensaje de error que se muestra es "No hay documentación encontrado ...",
por lo que es imposible distinguir si el error se debe a la falta módulo o falta
documentación. En tal escenario, la opción -m se vuelve práctica, ya que imprime todo el contenido del archivo junto con la ruta
.

+1

perldoc no es generalmente adecuado porque se trata de la documentación de un módulo que a veces puede estar separada del código, p. XML :: LibXML :: Documento. – daxim

+0

No me interesa aquí. Si puedes vender ealborar por qué este sería inadecuado, sería útil. Como opción -help del perldoc por: -m archivo del módulo de visualización en su totalidad -l Muestra el nombre de archivo del módulo Así perldoc essentily puede manejar los archivos de módulo En el caso anterior XML/LibXML/Documento. pod es un archivo pod, no un archivo .pm. Incluso un intento como % perl -e 'usa XML :: LibXML :: Document' da un error. – sateesh

+0

'perldoc -ml XML :: LibXML :: Document' le da la ruta al archivo' .pm' incluso si hay un archivo '.pod' separado. – hdp

2

Use pmvers. Como su nombre indica, muestra la versión de un módulo instalado. Si un módulo no está instalado, falla con el mensaje de error conocido: Can't locate … in @INC (@INC contains: …)

Use pmpath de la misma distribución para buscar la ruta de instalación de un módulo.

1

uso estas oneliners función bash/Perl para encontrar el número de versión y la ubicación de los módulos Perl:

# equivalent to perldoc -l <module> 
perlwhere() { 
    perl -wle'eval "require $ARGV[0]" or die; ($mod = $ARGV[0]) =~ s|::|/|g; print $INC{"${mod}.pm"}' $1 
} 

perlversion() { 
    perl -M$1 -wle'print $ARGV[0]->VERSION' $1 
} 

: [ether ~].2$; perlwhere Test::More 
/usr/lib/perl5/5.8.8/Test/More.pm 
: [ether ~].2$; perlversion Test::More 
0.94 
1

pmvers La utilidad y los otros pmtools hará lo que usted necesita.De lo contrario, aquí hay una sola línea para encontrar una versión del módulo:

perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module 
+0

Bien, aunque sugiero la siguiente modificación menor para poder distinguir un módulo inexistente de uno que no tiene un número de versión: 'perl -le 'eval" requiere $ ARGV [0] "o muere; print $ ARGV [0] -> VERSIÓN 'Some :: Module' – mklement0

5

Lo más corta que conozco que no se trata de un script de shell o alias:

$ perl -MFoo::Bar\ 99 
Foo::Bar version 99 required--this is only version 1.234. 

(o el mensaje habitual sobre no está en @INC si no está instalado)

Para los curiosos, esto es lo mismo que perl -e 'use Foo::Bar 99'.

+0

'cpan -D Foo :: Bar' es ligeramente más corto. :) –

3

Aquí es un programa que hace que:

#!/usr/bin/perl 
# testmod - test to see if a module is available 

use strict; 
use warnings; 

my $mod = (shift @ARGV) || die "usage: $0 module\n"; 

# convert module-name to path 
my $file = $mod; 
$file =~ s{::}{/}gsmx; 
$file .= '.pm'; 

# Pull in the module, if it exists 
eval { require $file } 
    or die "can't find module $mod\n"; 

# Get the version from the module, if defined 
my $ver; 
{ no strict 'refs'; 
    $ver = ${$mod . "::VERSION"} || 'UNKNOWN'; 
} 
# And its location 
my $from = $INC{$file}; 
print "module $mod is version $ver loaded from $from\n"; 
0

Si usted está buscando un CLI multiplataforma (Linux, OS X, Windows), considerar mi whichpm utility; ej .:

# Locate the Data::Dumper module, and also print 
# version information and core-module status. 
$ whichpm -v Data::Dumper 
Data::Dumper 2.145 core>=5.005 /usr/lib/perl/5.18/Data/Dumper.pm 

También puede encontrar duplicados accidentales y la lista de todos los módulos instalados.

Si le sucede que tiene instalados Node.js/io.js, puede instalarlo desde el registro NPM:

[sudo] npm install whichpm -g 

Para obtener instrucciones de instalación manual y más, vea the repo; aquí hay un enlace de descarga directa al latest version (se mantendrá actualizado).

Cuestiones relacionadas