2009-12-17 5 views
5

Gibt es eine kluge Möglichkeit zu erkennen, ob ein bestimmtes Perl-Modul in Ihrem System installiert wurde? Meine alte Methode ist, ein Perl-Skript zu schreiben, in dem ich nur das Modul benutze. Wenn beim Ausführen des Erkennungsskripts nichts krächzt, weiß ich, dass das Modul installiert wurde, obwohl ich immer noch nicht weiß, welche Version und wo das Modul installiert wurde.Wie bekomme ich die Version und den Speicherort eines installierten Perl-Moduls?

danke im voraus.

+1

Siehe auch http://stackoverflow.com/questions/135755/how-can-i-find-the-version-of-installed-perl-module – Ether

Antwort

9

Etwas wie:

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

würden Sie die Version eines bestimmten Moduls geben oder Ihnen sagen, es ist nicht installiert. Verbrauch würde wie folgt aussehen:

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

den Modulpfad finden, könnten Sie @INC untersuchen mögliche Standorte zu finden, oder man könnte vielleicht schauen Sie in perlwhich. Es gibt auch pmpath von pmtools.

+5

Wenn Sie pmtools verwenden, dann [pminst] (http://search.cpan.org/~mlfisher/pmtools/pminst) zeigt an, ob ein Modul installiert ist und [pmvers] (http://search.cpan.org/~mlfisher/pmtools/pmvers) zeigt welche Version ist installiert. ('apt-get install pmtools' auf 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

Gut zu wissen, aber beachten Sie, dass _core_ Module nicht separat aufgelistet sind, sondern als Dateien, die zu einem abstrakten Modul namens 'Perl' gehören. Abgesehen davon macht die Tatsache, dass 'instmodsh' eine _shell_ ist, die Benutzung etwas unkomfortabel - Sie benötigen mehrere interaktive Schritte, um die gewünschten Informationen zu erhalten, und während ich die _Lokation_ eines Moduls finden konnte, scheint es keinen Weg zu geben Holen Sie sich die _version_. Auf der anderen Seite ist die Verwendung des Befehls "l" eine bequeme Möglichkeit, alle Nicht-Kern-Module zu sehen (die möglicherweise mit einer bestimmten Verteilung geliefert wurden oder später von Benutzern installiert wurden). – mklement0

+0

Eine weitere Überlegung: 'instmodsh' findet keine Module, die nicht über' * .packlist' Dateien installiert wurden. – mklement0

1

Ich weiß nicht, ob es für diese jede intelligente Art und Weise ist. Aber was ich normalerweise
mache, ist die Verwendung von '-l' oder '-m' Option von perldoc. Zum Beispiel:

%perldoc -l XML::Simple

und der Ausgang ist so etwas wie unten, die der vollständige Pfad der Moduldatei ist

.../lib/XML/Simple.pm 

Der Vorteil bei diesem Ansatz im Vergleich zu Ihnen sind, dass, wenn das Modul installiert ist
die Ausgabe enthält den Pfad für den Modulort. Jedoch, wenn das Modul nicht installiert ist
oder wenn er keine Perldoc die Fehlermeldung angezeigt wird hat „Keine Dokumentation für ... gefunden“,
was es unmöglich macht, zu unterscheiden, ob der Fehler auf fehlende gebührt Modul oder fehlt
Dokumentation. In einem solchen Szenario wird die Option -m nützlich, da sie den gesamten Inhalt der Datei zusammen mit dem Pfad ausgibt.

+1

perldoc ist im Allgemeinen nicht geeignet, da es sich um die Dokumentation eines Moduls handelt, die manchmal vom Code getrennt sein kann, z. XML :: LibXML :: Dokument. – daxim

+0

Ich bekomme Ihre Bedenken hier nicht. Wenn Sie plesae ealborate warum wäre nicht geeignet wäre, wäre es hilfreich. Per Option -help des perldoc: -m-Datei des Display-Modul in seiner Gesamtheit -l den Namen Datei anzeigen des Moduls So essentily Perldoc die Moduldateien Im XML obigen Fall/LibXML/Dokument verarbeiten kann. Pod ist eine Pod-Datei, keine .pm-Datei. Selbst ein Versuch wie % perl -e 'XML :: LibXML :: Document' verwendet einen Fehler. – sateesh

+0

'perldoc -ml XML :: LibXML :: Dokument 'gibt Ihnen den Pfad zur' .pm' Datei, auch wenn es eine separate '.pod' Datei gibt. – hdp

2

Verwenden Sie pmvers. Wie der Name schon sagt, zeigt es die Version eines installierten Moduls. Wenn ein Modul nicht installiert ist, schlägt es mit der bekannten Fehlermeldung fehl: Can't locate … in @INC (@INC contains: …)

Verwenden Sie pmpath aus der gleichen Verteilung, um den Installationspfad eines Moduls zu finden.

1

Ich benutze diese bash Funktion/Perl oneliners die Versionsnummer und Standort von Perl-Module zu finden:

# 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

Das pmvers Dienstprogramm und die anderen pmtools wird tun, was Sie brauchen.Ansonsten ist hier ein Einzeiler eine Modul Version zu finden:

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

Schön, obwohl ich die folgenden kleinen zwicken vorschlagen, um in der Lage zu sein, ein nicht existierendes Modul von einem zu unterscheiden, das keine Versionsnummer hat: 'perl -le 'eval" require $ ARGV [0] "oder sterben; print $ ARGV [0] -> VERSION 'Some :: Module' – mklement0

5

Das kürzeste, was ich kenne, keinen Skript oder Shell-Alias ​​mit sich bringt:

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

(oder die übliche Nachricht über nicht in @INC, wenn es nicht installiert ist)

Für die Neugierigen ist dies das gleiche wie perl -e 'use Foo::Bar 99'.

+0

'cpan -D Foo :: Bar' ist etwas kürzer. :) –

3

Hier ist ein Programm, das das tut:

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

Wenn Sie sich für eine Cross-Plattform-CLI (Linux, OSX, Windows), betrachte meine whichpm utility suchen; z.B .:

# 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 

Es kann auch zufällige Duplikate und Liste alle installierten Module.

Wenn Sie Node.js/io.js installiert haben passieren, können Sie es aus der npm Registrierung installieren:

[sudo] npm install whichpm -g 

Für die manuellen Installationsanweisungen und mehr finden Sie the repo; Hier ist ein direkter Download-Link zum latest version (wird aktuell bleiben).

Verwandte Themen