2008-09-25 8 views
48

Wie finden Sie die Version eines installierten Perl-Moduls?Wie kann ich die Version eines installierten Perl-Moduls finden?

Dies ist in einer Antwort auf der Unterseite, aber ich finde es wichtig genug, um hier zu leben. Mit diesen Vorschlägen, erstelle ich eine Funktion in meinem .bashrc

function perlmodver { 
    perl -M$1 -e 'print "Version " . $ARGV[0]->VERSION . " of " . $ARGV[0] . \ 
    " is installed.\n"' $1 
} 
+1

Siehe auch http://stackoverflow.com/questions/ 1920045/how-can-i-get-the-version-und-location-of-an-install-perl-modul – Ether

Antwort

52

Warum versuchen Sie die Version des Moduls zu bekommen? Benötigen Sie dies innerhalb eines Programms, brauchen Sie nur die Nummer, um zu einer anderen Operation zu gelangen, oder versuchen Sie nur herauszufinden, was Sie haben?

Ich habe dies in den cpan gebaut (die mit Perl kommt) mit dem -D Schalter, so dass Sie die Version sehen können, die Sie installiert haben und die aktuelle Version auf CPAN:

 
$ cpan -D Text::CSV_XS 

Text::CSV_XS 
------------------------------------------------------------------------- 
     Fast 8bit clean version of Text::CSV 
     H/HM/HMBRAND/Text-CSV_XS-0.54.tgz 
     /usr/local/lib/perl5/site_perl/5.8.8/darwin-2level/Text/CSV_XS.pm 
     Installed: 0.32 
     CPAN:  0.54 Not up to date 
     H.Merijn Brand (HMBRAND) 
     [email protected] 

Wenn Sie sehen möchten, alle die out-of-date-Module, verwenden Sie die -O (Kapital O) Schalter:

 
$ cpan -O 
Module Name        Local CPAN 
------------------------------------------------------------------------- 
Apache::DB        0.1300 0.1400 
Apache::SOAP        0.0000 0.7100 
Apache::Session       1.8300 1.8700 
Apache::SizeLimit       0.0300 0.9100 
Apache::XMLRPC::Lite      0.0000 0.7100 
... and so on 

Wenn Sie dies für alle Module sehen wollen, die Sie installiert haben, versuchen Sie den -a Schalter einen autobundle zu erstellen.

+1

(Ich weiß, das ist eine alte Antwort!) Ich habe versucht -D und -O und cpan hat diese Optionen nicht verstanden. Die Manpage zeigte die Optionen, aber nicht perldoc. Was gibt? – Mei

+0

Gehen die Manpage und Perldoc mit verschiedenen Versionen? –

50

Die meisten Module (vor allem jene aus dem CPAN) eine $ VERSION Variable:

perl -MSome::Module -le 'print $Some::Module::VERSION' 
+1

Dies ist der beste Weg – dns

+3

Dies ist nicht abstrahiert, um mit einem Modul zu arbeiten. nicht richtige Antwort. –

+3

Das funktioniert. Allerdings sollte es unter Windows anders zitiert werden, damit es funktioniert (Beispiel für [File :: Fetch] (http://perldoc.perl.org/File/Fetch.html)): 'perl -MFile :: Fetch -le" print $ File :: Fetch :: VERSION "' - doppelte Anführungszeichen statt einfache Anführungszeichen (ansonsten ist eine Fehlermeldung das Ergebnis: "String-Terminator" '"kann nirgends vor EOF bei -e Zeile 1 gefunden werden.") –

8

Wenn Sie Glück haben, wird das Modul eine haben Paket Variable mit dem Namen $ VERSION:

$ perl -MCPAN -e 'print "$CPAN::VERSION\n"' 
1.9205 

Dies ist für die Module benötigt werden, auf CPAN verteilt, sondern intern mo entwickelt Duples folgen vielleicht einer anderen Konvention oder gar keiner.

+0

Dies ist für Module, die auf CPAN verteilt werden, nicht erforderlich. Viele Distributionen betrachten diese Variable, um die Version zu deklarieren, aber nur das Hauptmodul in der Distribution muss das tun. Schauen Sie sich eines der Module in Mojolicious an, die zum Beispiel nicht Mojolicuous.pm sind. –

2

Ich schrieb ein kleines Skript, um das zu melden: perlver.

Dies ist ein einfaches kleines Tool, das Ihnen sagt, welche Version eines Moduls Sie installiert haben, und wo die .pm Datei befindet. Es stellt auch sicher, dass das Modul erfolgreich geladen werden kann. Es konvertiert automatisch '-', '/' oder '\' in '::', so dass Sie einen Pfadnamen oder den Vertriebsnamen anstelle des kanonischen Modulnamens verwenden können.

Es wird davon ausgegangen, dass das Modul eine $ VERSION definiert. Wenn das Modul keine $ VERSION definiert, sagt es Ihnen immer noch, wo sich die .pm Datei befindet, so dass Sie es manuell untersuchen können. Sie können auch mehrere Module auf einmal überprüfen:

$ perlver CPAN DBD-Pg Getopt::Long 
CPAN 1.7602 is 
/usr/lib/perl5/5.8.8/CPAN.pm 
DBD::Pg 1.49 is 
/usr/lib/perl5/vendor_perl/5.8.8/i686-linux/DBD/Pg.pm 
Getopt::Long 2.36 is 
/usr/lib/perl5/vendor_perl/5.8.8/Getopt/Long.pm 
0

Zusätzlich für Module, die Exporter.pm verwenden, können Sie diese Informationen mit diesem Trick bekommen:

perl -MSome::Module=99999 -ex 
Some::Module version 99999 required--this is only version 1.9205 at ... 

Für Module, die nicht verwenden Exporter.pm, ein etwas längerer Trick berichtet die gleichen Informationen:

perl -e'use Some::Module 99999' 
Some::Module version 99999 required--this is only version 1.9205 at ... 
16

Es gibt einen weniger Typisierung Trick, die Ihre Modul funktionieren nicht über etwas verrückt wie ein Unix-Zeitstempel als Version n Umber.

perl -MFoo::Bar\ 9999 

Das funktioniert, weil, was es

use Foo::Bar 9999; 

das heißt eine Version von Foo :: Bar ist übersetzt, die mindestens in der Version 9999 oder höher ist. Und was man bekommt, ist

Foo::Bar version 9999 required--this is only version 1.1. 
BEGIN failed--compilation aborted. 

(Ordentlich Trick, den ich von Matt Trout gelernt.)

+0

Ich benutze das schon seit Ewigkeiten. Ich konnte mich nicht erinnern, wo ich es abgeholt hatte, aber wahrscheinlich habe ich es von der gleichen Stelle bekommen. – rjray

+0

Geringfügige Änderung für eine Windows-Eingabeaufforderung (aus welchem ​​Grund auch immer): perl -M "Foo :: bar 9999" – igelkott

+0

@igelkott: Dies funktioniert mit [File :: Fetch] (http://perldoc.perl.org/ File/Fetch.html), 'perl -M Datei :: Fetch 9999" '(64-bit Perl 5.18). Ausgabe: 'File :: Fetch Version 9999 erforderlich - das ist nur Version 0.46.'. Die zweite Zeile, "BEGIN failed - compilation abgebrochen.", Ist auf den ersten Blick verwirrend (in der Antwort aufgeführt). –

28

VERSION ist eine UNIVERSAL Methode aller Perl-Klassen. Sie können es verwenden, um die Modulversion zu erhalten (wenn es eingestellt wurde, was es normalerweise hat). Hier

ist ein Motto, wo man nur den Modulnamen einmal hinzufügen:

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

Danke, das ist alles, was ich gesucht habe :) – coredump

+0

Das ist genau das, was ich brauchte! – farhany

+1

Dies ist die richtige Antwort. –

3

Sehen Sie sich die pmtools Skripte auf CPAN. Wenn Sie eine Debian (-basierte) Distribution verwenden, gibt es auch eine praktische pmtools package. Dies beinhaltet ein Skript "pmvers", das Ihnen die Version eines Moduls mitteilt. Es ist ziemlich praktisch.

Es tut etwas Ähnliches wie die verschiedenen One-Liner-Leute geschrieben, aber es ist ein bisschen schlauer über die Fehlerbehandlung, und kann Ihnen die Version von mehr als einem Modul auf einmal.

5

Danke für die Antworten! Ich habe eine Funktion in meinem .bashrc erstellt, um bequem die Version eines Perl-Modul zu finden:

function perlmodver { 
    perl -M$1 -e 'print $ARGV[0]->VERSION . "\n"' $1 
} 
1

Wir haben das System Perl haben (/ usr/bin/perl) in Solaris 10, und über Lösungen sind nutzlos. Einige von ihnen melden "module.pm ist nicht installiert", einige von ihnen haben keine Ausgabe.

Hier ist der Code, der hilfreich ist, der alle Module und ihre Version auflisten kann.

#!/usr/bin/perl 

use strict; 
use ExtUtils::Installed; 

my @modules; 
my $installed = ExtUtils::Installed->new(); 

if (scalar(@ARGV) > 0) { 

    @modules = @ARGV; 

} else { 

    @modules = $installed->modules(); 

} 

print "Module\tVersion\n"; 

foreach (@modules) { 

    print $_ . "\t" . $installed->version($_) . "\n"; 

} 
0

Sie können auch einen Blick auf App::module::version nehmen

$ module-version 

The version of App::module::version in /home/yourself/perl5/lib/perl5 is 1.004 
1

Am einfachsten zu erinnern und robusteste Version für mich:

perl -e 'use Search::Elasticsearch; print $Search::Elasticsearch::VERSION;' 
Verwandte Themen