2008-09-22 7 views
72

Abgesehen vonWie bekomme ich eine Liste der installierten CPAN-Module?

versuchen
perldoc <module name> 

individuell für jeden CPAN-Modul, das meine Phantasie oder gehen durch das Dateisystem und Blick auf die Verzeichnisse nimmt habe ich keine Ahnung, welche Module, die wir installiert haben.

Was ist der einfachste Weg, um einfach eine große Liste aller installierten CPAN-Module zu bekommen? Von der Befehlszeile oder anderweitig.

+0

Möchten Sie wissen, welche Module installiert sind, oder welche Distributionen installiert sind? –

Antwort

61

Dies ist in der Perl-FAQ beantwortet, die Antwort, die schnell mit gefunden werden kann. Kurz gesagt, es kommt auf die Verwendung ExtUtils::Installed oder File::Find, Varianten von beiden, die zuvor in diesem Thread behandelt wurden.

Den FAQ-Eintrag "How do I find which modules are installed on my system?" finden Sie auch in perlfaq3. Sie können eine Liste aller FAQ Antworten sehen, indem Sie in perlfaq

+25

Dies gibt so viel mehr als das OP angefordert, dass es praktisch nutzlos ist. – Justin

+8

'cpan -l' erster Eintrag im' perldoc -q install'-Befehl. – shadowbq

+2

cpan -l macht eine rekursive Suche nach dem Verzeichnis, aus dem ich es ausführe. Gibt es eine Möglichkeit, die 'skip_cwd'-Option des' ExtUtils :: Installed'-Konstruktors über diese Befehlszeile zu übergeben? –

31
perldoc perllocal 

Edit: Es gibt eine (kleine) weitere Informationen über sie in der CPAN FAQ

+2

Danke für den Link zu den FAQ. Leider kehren nicht alle Module, die ich kenne, zurück. Datum :: Calc erscheint nicht einmal dort. –

+3

perldoc perllocal zeigt keine über CPAN + installierten Module an. –

9

Ich mag den Befehl 'r' CPAN verwenden dafür. Sie können mit dem alten Stil in der CPAN-Shell erhalten:

sudo perl -MCPAN -e shell 

oder auf den meisten neueren Systemen gibt es einen Befehl ‚cpan‘ ist, so wird dieser Befehl Sie an die Shell erhalten:

sudo cpan 

(Normalerweise müssen Sie 'sudo' verwenden, um es als root auszuführen, oder 'su -' verwenden, um root zu werden, bevor Sie es ausführen, es sei denn, Sie haben cpan so eingerichtet, dass Sie es als normaler Benutzer ausführen können, aber als root installieren Wenn Sie keinen Root-Computer auf diesem Computer haben, können Sie die CPAN-Shell weiterhin verwenden, um diese Informationen herauszufinden, aber Sie können keine Module installieren, und Sie müssen möglicherweise beim ersten Mal ein wenig Setup durchführen Sie führen es.)

Sobald Sie sich in der cpan-Shell befinden, können Sie den Befehl 'r' verwenden, um alle installierten Module und ihre Versionen zu melden. Geben Sie an der Eingabeaufforderung "cpan>" "r" ein. Dadurch werden alle installierten Module und ihre Versionen aufgelistet. Benutzen '?' um mehr Hilfe zu bekommen.

+1

eigentlich 'r' gibt Ihnen die Neuinstallationsempfehlungen - dh alle Module auf Ihrer Installation, die eine neuere Version von CPAN haben. Sofern Ihre Installation nicht veraltet ist, ist dies keine vollständige Liste. – EvdB

+0

Mein 'r' meldet immer so gut wie nichts, weil ich zwangsweise aufwerte. Das erinnert mich ... Ich habe heute noch kein Upgrade durchgeführt. – skiphoppy

+3

Die -r kompiliert Zeug. Um eine Liste zu erhalten, versuchen Sie -a oder laden Sie die neuesten Quellen herunter und spielen Sie mit dem neuen -l-Schalter, der nur für diese Antwort hinzugefügt wurde. :) –

6

Hier ist ein wirklich hacky Weg, es in * nix zu tun, Sie werden einige Sachen bekommen, die Sie nicht wirklich interessieren (dh: warnings :: Register etc), aber es sollte Ihnen eine Liste von jedem .pm geben Datei, die per Perl erreichbar ist.

 

for my $path (@INC) { 
    my @list = `ls -R $path/**/*.pm`; 
    for (@list) { 
     s/$path\///g; 
     s/\//::/g; 
     s/\.pm$//g; 
     print; 
    } 
} 
 
+2

Das wird ihm nicht geben, was er will. Es gruppiert keine verwandten Dateien nach der Verteilung, zu der sie gehören, und es listet alle Kern * .pm-Dateien von Perl selbst auf. – rjray

23

Es ist erwähnenswert, dass perldoc perllocal nur über Module berichtet, die über CPAN installiert wurden. Wenn jemand Module manuell installiert, findet es sie nicht. Wenn Sie mehrere Personen haben, die Module installieren und sich die Datei perllocal.pod unter der Quellcodeverwaltung befindet, können Personen Konflikte möglicherweise falsch auflösen und die Liste beschädigen (dies ist beispielsweise bei der Arbeit der Fall).

Leider scheint die Lösung durch @INC mit File :: Find oder ähnlichem zu gehen. Dies findet jedoch nicht nur die Module, sondern findet auch verwandte Module in einer Distribution. Beispielsweise würde es TAP :: Harness und TAP :: Parser zusätzlich zu dem tatsächlichen Verteilungsname von Test :: Harness melden (vorausgesetzt, Sie haben Version 3 oder höher). Sie könnten sie möglicherweise mit Distributionsnamen abgleichen und die Namen, die nicht übereinstimmen, verwerfen, aber dann könnten Sie lokal erstellte und installierte Module verwerfen.

Ich glaube, brian d foy die Backpan Indizierung Arbeit soll Code um es bei .pm Datei übergeben und es wird versuchen, die Verteilung abzuleiten, aber auch dies scheitert manchmal, weil was in einem Paket nicht unbedingt installiert ist (siehe Devel :: Cover :: Inc für ein Beispiel).

+1

Ich glaube nicht, dass ich die BackPAN-Kataloggewehre herausziehen muss. Etwas wie ich tue mit Test :: Prereq, um es zu kollabieren, nach welcher Distribution es in 02-Paketen findet, könnte genug sein. Das ist ein kleiner Trick, als nur die Moduldateien aufzulisten, und der Katalog ist noch nicht so weit damit beschäftigt. –

+2

Von einem rudimentären Test (mache eine "make -n install" in einigen Verzeichnissen, die ich herumliegen habe), wird der "make install" Schritt jedes MakeMaker-basierten Moduls perlokal aktualisiert. Es ist nicht spezifisch für die direkte Installation über CPAN. – rjray

+1

Ich denke, Dist :: Surveyor ist immer noch das beste Werkzeug zur Beantwortung der Frage "welche * Distributionen * sind in dieser Bibliothek installiert?". Für weitere Details siehe [diese Präsentation] (http://www.slideshare.net/Tim.Bunce/perl-distsurveyor-2011). Es gibt eine einfach zu bedienende fatpacked Version im [git repo] (https://github.com/timbunce/Dist-Surveyor/network). –

19

Sie können versuchen, ExtUtils-Installed, aber das sieht nur in .packlist s, so dass es Module vermissen kann, dass Menschen Dinge in @INC von Hand bewegt.

Ich schrieb App-Module-Lister für einen Freund, der dies als CGI-Skript auf einem Nicht-Shell-Webhosting-Konto tun wollte. Sie nehmen einfach die Moduldatei und laden sie als einen Dateinamen hoch, den Ihr Server als CGI-Skript behandelt. Es hat keine Abhängigkeiten außerhalb der Standardbibliothek. Verwenden Sie es wie es ist oder stehlen Sie den Code.

Es gibt eine Liste der Module und deren Versionen:

 
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 

I Bedeutung habe dies als eine Funktion der cpan Werkzeug hinzuzufügen, werde ich das auch tun. [Zeit vergeht] Und jetzt habe ich einen -l Schalter in cpan. Ich habe ein paar andere Dinge damit zu tun, bevor ich eine Veröffentlichung mache, aber it's in github. Wenn Sie nicht darauf warten möchten, können Sie einfach den Schalter -a verwenden, um ein Autobundle zu erstellen, obwohl das einen Pod um die Liste legt.

Viel Glück;

1

Um durch die @ INC Verzeichnisbäume ohne Verwendung eines externen Programms wie ls (1) zu gehen, könnte man das File::Find::Rule Modul verwenden, das eine nette deklarative Schnittstelle hat.

Sie möchten auch Duplikate herausfiltern, wenn frühere Perl-Versionen dieselben Module enthalten. Der Code, dies zu tun wie folgt aussieht:

#! /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}++; 
    } 
} 

Am Ende des Laufes, können Sie auch alle Ihre Modulnamen als Schlüssel in der% gesehen Hash haben. Der Code könnte angepasst werden, um den kanonischen Dateinamen (in $ datei) als den Wert des Schlüssels anstelle einer Anzahl von gesehenen Zeiten zu speichern.

2

suchen Die Antwort kann in der Perl FAQ list gefunden werden.

Sie sollten die ausgezeichnete Dokumentation abschöpfen, die

perldoc perltoc 
1

ich genau dies zu tun, nur gestern einen Perl-Skript geschrieben mit Perl kommt. Das Skript gibt die Liste der in @INC installierten Perl-Module zurück, wobei das Trennzeichen "::" verwendet wird. Rufen Sie das Skript -

perl perlmod.pl 

ODER

perl perlmod.pl <module name> #Case-insensitive(eg. perl perlmod.pl ftp) 

Ab sofort das Skript das aktuelle Verzeichnis überspringt (‘.‚), Da ich Probleme mit Rekursion Soft-Links haben, aber man kann es durch eine Änderung der grep-Funktion in Zeile 17 von

grep { $_ !~ '^\.$' } @INC 

nur schließen,

@INC 

Das Skript kann here.

finden
1

Versuchen Sie man perllocal oder perldoc perllocal.

1

Ich kann vorschlagen, diezu verwenden, insbesondere pminst akzeptiert reguläre Ausdrücke.

9

Hier ist ein Skript, das den Trick tun würde:

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 
0

das Perl Kochbuch enthält mehrere Iterationen eines Skripts „pmdesc“ das tut, was Sie wollen. Google-Suche nach "Perl Cookbook pmdesc" und Sie finden articles on other Q&A Sites, mehrere Code-Listings im Netz, eine Diskussion der Lösung und sogar some refinements.

2

Hier ist ein Perl-Einzeiler, die eine Liste der installierten Module auszudrucken wird:

perl -MExtUtils::Installed -MData::Dumper -e 'my ($inst) = ExtUtils::Installed->new(); print Dumper($inst->modules());' 

Sie sicher, dass Sie haben Data :: Dumper installiert.

+1

Dies zeigt nur etwa 15 Perl-Module an, anstatt der 5945, die 'cpan -l' auflistet . –

2

Versuchen Sie den folgenden Befehl

instmodsh

2
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC' 
15

behauptet, dass cpan -l den Trick, aber es ist nicht für mich arbeiten. Die andere Option:

cpan -a

nicht spucken eine schöne Liste der installierten Pakete und hat den netten Nebeneffekt, sie in eine Datei zu schreiben.

+1

Für die Aufzeichnung funktioniert 'cpan -l' (oder tut es für mich mit CPAN v2.05). 'cpan -a' ist in der Tat hübscher. –

-3

Dies ist, was ich tue: perl -M{cpan_module}
Wenn Sie keine Fehler erhalten, besteht eine gute Chance, dass das Modul installiert ist.

+2

Ich glaube nicht, dass dies die Frage beantwortet. Unter Verwendung dieses Vorschlags könnte es jemanden ziemlich lange dauern, Modul für Modul durchzugehen, um herauszufinden, welche Module installiert sind oder nicht. –

5

Sie können die Liste der in Ihrem System installierten Perl-Module mit dem Befehl instmodsh in Ihrem Terminal abrufen.Es fordert Dir drei Option, um die Ausgabe sie sind zu verbessern:

l   - List all installed modules 
    m <module> - Select a module 
    q   - Quit the program 
0
cd /the/lib/dir/of/your/perl/installation 
perldoc $(find . -name perllocal.pod) 

Windows-Benutzer tun Suche einer Windows-Explorer nur um es zu finden.

14
$ 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" 
+1

das funktioniert gut für diejenigen von uns, die keine cpan installiert haben. – pdwalker

+0

Wirklich unterschätzte Antwort. Dies funktioniert auch für RHEL-Distributionen. –

+0

Ich habe: 'Keine Dokumentation gefunden für" perllocal ".' –

-1

Verwenden Perldoc -q für weitere Informationen installiert oder Geben Sie einfach

perldoc <Module::Name> 
0

Die für mich folgende gearbeitet.

$ perldoc perllocal | grep Module 
$ perldoc perllocal | grep -E 'VERSION|Module' 
0

Wie Sie geben Sie Ihre Perl-Skript haben Sie alle installierten Module als .PM Dateien unter den Ordnern in @INC so ein kleines Bash-Skript wird die Arbeit für Sie tun:

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

Warum nicht? 'find \' perl -le'print für @ INC '\ '-name' * .pm'' –

0

Für Linux Der einfachste Weg zu erhalten ist,

Verwandte Themen