Wie erhalte ich eine Liste der installierten CPAN-Module?


88

Abgesehen davon, es zu versuchen

perldoc <module name>

Individuell für jedes CPAN-Modul, das mir gefällt oder das Dateisystem durchläuft und sich die Verzeichnisse ansieht, habe ich keine Ahnung, welche Module wir installiert haben.

Was ist der einfachste Weg, um eine große Liste aller installierten CPAN-Module zu erhalten? Über die Befehlszeile oder auf andere Weise.


Ich kann vorschlagen, die pmtools zu verwenden , insbesondere pminst, das reguläre Ausdrücke akzeptiert.
Lukmdo

perl-pmtools ist das gute Werkzeug für Sie.
Jaseywang

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

4
Ich fand cpan -lmich unter Windows nützlich.
nichtig

1
Dies könnte nützlich sein:instmodsh
Ravi

Antworten:


65

Dies wird in den Perl-FAQ beantwortet, die Antwort, die schnell mit gefunden werden kann perldoc -q installed. Kurz gesagt, es kommt darauf an , Varianten von beiden zu verwenden ExtUtils::Installedoder zu verwenden File::Find, die zuvor in diesem Thread behandelt wurden.

Dort finden Sie auch den FAQ-Eintrag "Wie finde ich, welche Module auf meinem System installiert sind?" in perlfaq3. Sie können eine Liste aller FAQ-Antworten sehen, indem Sie in perlfaq suchen


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

2
cpan -l führt eine rekursive Suche in dem Verzeichnis durch, in dem ich es ausführe. Gibt es eine Möglichkeit, die ExtUtils::InstalledKonstruktoroption skip_cwdüber diese Befehlszeile zu übergeben?
Mark Reed

10
Die FAQ sagt zu verwenden, cpan -laber das funktioniert nicht auf RHEL6 und /usr/bin/cpan -lwirft den Fehler Unknown option: l.
Stefan Lasiewski

1
$ perldoc perllocal | grep Modul $ perldoc perllocal | grep -E 'VERSION | Module'
caot

Verwenden Sie perldoc -t perllocal, um eine Nur-Text-Ausgabe zu erhalten. Andernfalls funktioniert grep aufgrund eingebetteter Strg-Zeichen möglicherweise nicht
user333869

36
perldoc perllocal

Bearbeiten: Weitere Informationen dazu finden Sie in den CPAN-FAQ


2
Danke für den Link zu den FAQ. Leider kehren nicht alle mir bekannten Module zurück. Date :: Calc wird dort nicht einmal angezeigt.
David McLaughlin

26

perldoc -q installed

behauptet, cpan -ldas würde den Trick machen, aber es funktioniert nicht für mich. Die andere Option:

cpan -a

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


2
Funktioniert für die Aufzeichnung cpan -l(oder funktioniert für mich mit CPAN v2.05). cpan -aist in der Tat schöner.
William Turrell

23

Es ist erwähnenswert, dass perldoc perllocal nur über Module berichtet, die über CPAN installiert wurden. Wenn jemand Module manuell installiert, werden sie nicht gefunden. Wenn mehrere Personen Module installieren und die Datei perllocal.pod unter Quellcodeverwaltung steht, können Konflikte möglicherweise falsch gelöst und die Liste beschädigt werden (dies ist beispielsweise hier bei der Arbeit geschehen).

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

Ich glaube, brian d foys Backpan-Indizierungsarbeit soll Code enthalten, der an die PM-Datei übergeben wird, und es wird versucht, auf die Verteilung zu schließen, aber selbst dies schlägt manchmal fehl, da das, was in einem Paket enthalten ist, nicht unbedingt installiert ist (siehe Devel :: Cover) :: Inc für ein Beispiel).


1
Ich glaube nicht, dass ich die BackPAN-Katalogwaffen für diese herausziehen muss. Etwas wie ich mit Test :: Prereq mache, um es durch die Distribution zu reduzieren, die es in 02packages findet, könnte ausreichen. Das ist allerdings ein wenig kniffliger als nur die Moduldateien aufzulisten, und der Katalog ist noch nicht in der Nähe davon.
Brian D Foy

2
Ausgehend von einem rudimentären Test (Durchführen einer "make-n-Installation" in einigen von mir herumgelegten Verzeichnissen) wird der Schritt "make install" eines MakeMaker-basierten Moduls perllocal aktualisiert. Es ist nicht spezifisch für die direkte Installation über CPAN.
rjray

1
Ich denke, Dist :: Surveyor ist immer noch das beste Tool zur Beantwortung der Frage "Welche Distributionen sind in dieser Bibliothek installiert?". Weitere Informationen finden Sie in dieser Präsentation . Es gibt eine einfach zu bedienende, fettgepackte Version im Git Repo .
Tim Bunce

20
$ 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"

2
Dies funktioniert gut für diejenigen von uns, die kein cpan installiert haben.
pdwalker

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

4
Ich bekam:No documentation found for "perllocal".
Luis A. Florit

Es dauerte länger als erwartet (ungefähr 20 Sekunden auf meinem Computer), aber es funktionierte einwandfrei! Gute Antwort.
Hans Goldman

19

Sie können ExtUtils-Installed ausprobieren , aber das sieht nur in .packlists aus, sodass möglicherweise Module fehlen, in die Benutzer Dinge verschoben haben@INC von Hand .

Ich habe App-Module-Lister geschrieben für einen Freund geschrieben, der dies als CGI-Skript auf einem Nicht-Shell-Webhosting-Konto tun wollte. Sie nehmen einfach die Moduldatei und laden sie als Dateinamen hoch, den Ihr Server als CGI-Skript behandelt. Es gibt 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 ihrer Versionen aus:

Tie :: Cycle 1.15
Tie :: IxHash 1.21
Tie :: Toggle 1.07
Tie :: ToObject 0.03
Zeit :: CTime 99.062201
Time :: DaysInMonth 99.1117
Zeit :: Epoche 0.02
Zeit :: Fuzzy 0,34
Zeit :: JulianDay 2003.1125
Time :: ParseDate 2006.0814
Zeit :: Zeitzone 2006.0814

Ich wollte dies als Feature zum cpanTool hinzufügen , also mache ich das auch. [Die Zeit vergeht] Und jetzt habe ich einen -lSchalter cpan. Ich habe noch ein paar andere Dinge damit zu tun, bevor ich eine Veröffentlichung mache, aber es ist in Github . Wenn Sie nicht darauf warten möchten, können Sie einfach versuchen, mit dem -aSchalter ein Autobundle zu erstellen, obwohl dadurch einige Pods in die Liste aufgenommen werden.

Viel Glück;


11

Hier ein Skript, das den Trick machen 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

Unter RHEL 6.9 druckt dieser Scrip nur Folgendes: Perl - 5.10.1 Module werden nicht aufgelistet.
Hans Deragon

9

Ich verwende dafür gerne den CPAN-Befehl 'r'. Sie können mit dem alten Stil in die CPAN-Shell einsteigen:

sudo perl -MCPAN -e shell

Auf den meisten neueren Systemen gibt es den Befehl 'cpan', sodass Sie mit diesem Befehl zur Shell gelangen:

sudo cpan

(Normalerweise müssen Sie 'sudo' verwenden, um es als root auszuführen, oder 'su -', um root zu werden, bevor Sie es ausführen, es sei denn, Sie haben cpan so eingerichtet, dass Sie es als normalen Benutzer ausführen können, aber als root installieren. Wenn Sie auf diesem Computer kein Root-Verzeichnis haben, können Sie die CPAN-Shell weiterhin verwenden, um diese Informationen zu erhalten. Sie können jedoch keine Module installieren, und Sie müssen möglicherweise beim ersten Mal einige Einstellungen vornehmen starte es.)

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


1
Tatsächlich gibt Ihnen 'r' die Empfehlungen für die Neuinstallation - dh alle Module in Ihrer Installation, die eine neuere Version von CPAN haben. Sofern Ihre Installation nicht sehr veraltet ist, ist dies keine vollständige Liste.
EvdB

Mein 'r' meldet immer so gut wie nichts, weil ich zwanghaft aktualisiere. Was mich erinnert ... Ich habe heute noch kein Upgrade durchgeführt.
Skiphoppy

3
Das -r kompiliert Sachen neu. Um eine Liste zu erhalten, versuchen Sie -a oder laden Sie die neuesten Quellen herunter und spielen Sie mit dem neuen Schalter -l, der nur für diese Antwort hinzugefügt wurde. :)
Brian D Foy

1
Warum das sudohier? Es ist völlig unnötig.
Aristoteles Pagaltzis

2
Beachten Sie den Unterschied zwischen dem Befehlszeilenargument '-r' zu 'cpan' und dem Befehl 'r' in der cpan-Shell :)
EvdB

7

Hier ist eine wirklich hackige Möglichkeit, dies in * nix zu tun. Sie erhalten einige Dinge, die Sie nicht wirklich interessieren (z. B. warnings :: register usw.), aber es sollte Ihnen eine Liste aller .pm-Dateien geben, auf die über zugegriffen werden kann perl.


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


2
Dies wird ihm nicht geben, was er will. Verwandte Dateien werden nicht nach der Distribution gruppiert, zu der sie gehören, und es werden alle Core * .pm-Dateien von Perl selbst aufgelistet.
rjray

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

Dies ist sehr gut, da es den vollständigen Pfad zu jedem *.pmModul deutlich zeigt . Sie können viele Duplikate sehen ...
not2qubit

7

Sie können eine Liste der instmodshin Ihrem System installierten Perl-Module mithilfe des Befehls in Ihrem Terminal abrufen. Sie werden nach drei Optionen gefragt, um die Ausgabe zu verbessern:

   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program

5

Unter Linux / Unix verwende ich diesen einfachen Befehl:

perl -e 'print qx/find $_ -name "*.pm"/ foreach ( @INC );' 

Es scannt alle Ordner ein @INCund sucht nach einer * .pm-Datei.


Danke dir! Sehr hilfreich.
not2qubit

Danke dir! Das ist vielleicht der Perl, den ich je mit einem so prägnanten Ausdruck gelernt habe.
ewd


2

Die Antwort finden Sie in der Perl-FAQ-Liste .

Sie sollten die ausgezeichnete Dokumentation überfliegen, die mit Perl geliefert wird

perldoc perltoc


1

Ich habe erst gestern ein Perl-Skript geschrieben, um genau das zu tun. Das Skript gibt die Liste der in @INC installierten Perl-Module zurück, wobei '::' als Trennzeichen verwendet wird. Rufen Sie das Skript mit - auf

perl perlmod.pl

ODER

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

Ab sofort überspringt das Skript das aktuelle Verzeichnis ('.'), Da ich Probleme mit rekursiven Softlinks hatte. Sie können es jedoch einschließen, indem Sie die grep-Funktion in Zeile 17 von ändern

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

zu nur,

@INC

Das Skript finden Sie hier.



1

Um durch die @ INC-Verzeichnisbäume zu gehen, ohne ein externes Programm wie ls (1) zu verwenden, könnte man das verwenden File::Find::Rule Modul verwenden, das eine schöne deklarative Schnittstelle hat.

Außerdem möchten Sie Duplikate herausfiltern, falls frühere Perl-Versionen dieselben Module enthalten. Der Code dafür sieht folgendermaßen aus:

#! /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 Laufs haben Sie auch alle Ihre Modulnamen als Schlüssel im% Seen-Hash. Der Code könnte angepasst werden, um den kanonischen Dateinamen (angegeben in $ file) als Wert des Schlüssels zu speichern, anstatt wie oft gesehen zu werden.


1

Folgendes hat bei mir funktioniert.

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

1

Alle diejenigen, die Perldoc oder andere Module nicht installieren können und wissen möchten, welche Module verfügbar sind (CPAN oder andere), funktionieren unter Linux und Mingw32 / 64 wie folgt:

grep -RhIP '^package [A-Z][\w:]+;' `perl -e 'print join " ",@INC'` | sed 's/package //' | sort | uniq

Ja, es ist chaotisch. Ja, es wird wahrscheinlich mehr gemeldet, als Sie möchten. Wenn Sie es jedoch in eine Datei leiten, können Sie beispielsweise leicht überprüfen, welche DBM-Schnittstellen vorhanden sind:

 grep -RhIP '^package [A-Z][\w:]+;' `perl -e 'print join " ",@INC'` | sed 's/package //' | sort | uniq > modules-installed
 cat modules-installed | grep -i dbm 

AnyDBM_File;
Memoize::AnyDBM_File;
Memoize::NDBM_File;
Memoize::SDBM_File;
WWW::RobotRules::AnyDBM_File;

Deshalb bin ich auf dieser Seite gelandet (enttäuscht)

(Mir ist klar, dass dies die Frage des OP nicht genau beantwortet, aber ich poste es für jeden, der aus dem gleichen Grund wie ich hier gelandet ist. Das ist das Problem mit Stack *** Es ist fast unmöglich, die Frage zu finden, die Sie sind Fragen, auch wenn es existiert, doch Stack *** ist fast immer Googles Top-Hit!)


Das hat bei mir funktioniert. Vielen Dank für die Veröffentlichung. Ich brauchte dies in einer Umgebung, in der ich nicht viel Zugriff habe, um Abhängigkeiten zu installieren / aktualisieren.
Ashish Kumar


0

Hier ist ein Perl-Einzeiler, der eine Liste der installierten Module druckt:

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

Stellen Sie einfach sicher, dass Data :: Dumper installiert ist.


2
Dies listet nur ungefähr 15 Perl-Module auf, anstatt der 5945, die 'cpan -l' auflistet.
Paul Tomblin

0
cd /the/lib/dir/of/your/perl/installation
perldoc $(find . -name perllocal.pod)

Windows-Benutzer führen einfach eine Windows Explorer-Suche durch, um sie zu finden.


0

Versuchen Sie "perldoc -l":

$ perldoc -l Log :: Dispatch /usr/local/share/perl/5.26.1/Log/Dispatch.pm


-1

Wenn Sie Ihr Perl-Skript eingeben, haben Sie alle installierten Module als PM-Dateien unter den Ordnern in @INC, sodass ein kleines Bash-Skript die Aufgabe für Sie erledigt:

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

Warum nicht? find `perl -le'print for@INC'` -name '*.pm'
Hynek-Pichi-Vychodil

-2

Für Linux ist der einfachste Weg,

dpkg -l | grep "perl"

1
Das OP bat um eine Liste der im System installierten CPAN (Perl) -Module, nicht wenn Perl im System installiert ist (weder das OP teilte uns mit, ob apt verfügbar ist)
ROLO

Ich bin kein Perl-Experte, aber ich habe installierte Perl-Module von oben gesehen. Vielleicht nicht die perfekte Antwort hier.
Yasiru G

-2

Das funktioniert bei mir

perl -e 'print join("\n",@INC,"")'

Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte und sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
Machavity

-3

Folgendes mache ich: 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. Mit diesem Vorschlag kann es eine Weile dauern, bis jemand Modul für Modul durchgeht, um herauszufinden, welche Module installiert sind oder nicht.
Dave Newman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.