it-swarm.dev

Wie bekomme ich eine Liste der installierten CPAN-Module?

Abgesehen von dem Versuch

perldoc <module name>

individuell für jedes CPAN-Modul, das mir gefällt oder durch das Dateisystem geht und die Verzeichnisse betrachtet, weiß ich nicht, welche Module wir installiert haben. 

Was ist der einfachste Weg, um eine große Liste aller installierten CPAN-Module zu erhalten? Von der Kommandozeile oder anders.

80

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

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

63
pjf
perldoc perllocal

Edit: Im CPAN FAQ gibt es (etwas) mehr Infos dazu

33
Dan

perldoc -q installed

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

cpan -a

spuckt eine Nice-Liste der installierten Pakete aus und hat den Nice-Nebeneffekt, wenn sie in eine Datei geschrieben werden.

24
Paul Rubel

Es ist erwähnenswert, dass Perldoc Perllocal nur über CPAN installierte Module berichtet. Wenn jemand Module manuell installiert, findet er sie nicht. Wenn mehrere Personen Module installieren und der perllocal.pod der Quellcodeverwaltung unterliegt, lösen die Benutzer möglicherweise Konflikte falsch und beschädigen die Liste (z. B. bei der Arbeit).

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

Ich glaube, die Backpan-Indizierungsarbeit von Brian D foy sollte über den Code in der .pm-Datei verfügen, und es wird versucht, auf die Verteilung zu schließen, aber selbst dies schlägt manchmal fehl, weil das, was sich in einem Paket befindet, nicht unbedingt installiert ist (siehe Devel :: Cover :: Inc für ein Beispiel).

23
Ovid

Sie können versuchen, ExtUtils-Installed zu verwenden, aber das sieht nur in .packlists aus, so dass Module fehlen könnten, in denen die Benutzer Dinge manuell in @INC verschoben haben.

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

Es gibt eine Liste der Module und ihrer Versionen aus:

 Tie :: Zyklus 1.15 
 Tie :: IxHash 1.21 
 Tie :: Toggle 1.07 
 Tie :: ToObject 0.03 
 Zeit :: CTime 99.062201 
 Zeit :: DaysInMonth 99.1117 
Time :: Epoch 0.02 
 Time :: Fuzzy 0.34 
 Time :: JulianDay 2003.1125 
 Time :: ParseDate 2006.0814 
 Time :: Timezone 2006.0814 

Ich hatte vor, dies als Funktion zum cpan-Tool hinzuzufügen, also mache ich das auch. [Zeit vergeht] Und jetzt habe ich einen -l-Schalter in 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 mit der -a-Option eine Autobundle erstellen, obwohl dies einen Teil der Liste umgibt.

Viel Glück;

19
brian d foy
$ 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"
15
Dan

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
11
Joakim

Ich benutze dafür gern den CPAN-Befehl 'r'. Sie können mit der alten Art in die CPAN-Shell einsteigen:

Sudo Perl -MCPAN -e Shell

bei den meisten neueren Systemen gibt es den Befehl 'cpan'. Mit diesem Befehl gelangen Sie zur Shell:

Sudo cpan

(Normalerweise müssen Sie Sudo verwenden, um es als root auszuführen, oder verwenden Sie "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 nicht über root auf diesem Computer verfügen, können Sie die CPAN-Shell immer noch verwenden, um diese Informationen herauszufinden. Sie können jedoch keine Module installieren. Möglicherweise müssen Sie 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 deren Versionen melden. Geben Sie an der Eingabeaufforderung "cpan>" "r" ein. Daraufhin werden alle installierten Module und ihre Versionen aufgelistet. Benutzen '?' um weitere Hilfe zu bekommen.

9
amoore

Hier ist eine wirklich harte Art, dies in * nix zu tun. Sie erhalten ein paar Dinge, die Sie nicht wirklich interessieren (zB: warnings :: register etc), aber es sollte Ihnen eine Liste aller .pm-Dateien geben, auf die über zugegriffen wird Perl.


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

Sie können eine Liste der in Ihrem System installierten Perl-Module erhalten, indem Sie den Befehl instmodsh in Ihrem Terminal verwenden. Es werden drei Optionen angezeigt, um die Ausgabe zu verbessern: 

   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program
6
Thiyagu ATR
Perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'
3
slayedbylucifer

Die Antwort finden Sie in der Liste Perl FAQ .

Sie sollten die hervorragende Dokumentation von Perl überfliegen

perldoc perltoc
2
Sinan Ünür

Versuchen Sie man perllocal oder perldoc perllocal.

2
Walter H

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

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

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

2
thealexbaron

Versuchen Sie den folgenden Befehl

instmodsh

2
user2024286

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

Sie möchten auch 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 (in $ file angegeben) als Wert des Schlüssels zu speichern, anstatt die Anzahl der angezeigten Zeiten zu ermitteln.

1
dland

Ich habe gerade gestern ein Perl-Skript geschrieben, um genau dies 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 der Rekursion von Soft-Links hatte. Sie können es jedoch einfügen, indem Sie die grep-Funktion in Zeile 17 ändern 

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

nur

@INC

Das Skript ist hier zu finden.

1
aks

Hier ist noch ein weiteres Befehlszeilenprogramm zum Auflisten aller installierten .pm-Dateien:

Finde installierte Perl-Module, die einem regulären Ausdruck entsprechen

  • Portable (verwendet nur Kernmodule)
  • Cache-Option für schnellere Suche
  • Konfigurierbare Anzeigeoptionen
1
toolic

Unter Linux/Unix verwende ich diesen einfachen Befehl:

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

Es durchsucht alle Ordner in @INC und sucht nach einer * .pm-Datei.

1

Bei der Eingabe Ihres Perl-Skripts haben Sie alle installierten Module als .pm-Dateien unter den Ordnern in @INC installiert.

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

Folgendes hat für mich gearbeitet.

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

das Perl-Kochbuch enthält mehrere Iterationen eines Skripts "pmdesc", das macht, was Sie wollen. Bei der Google-Suche nach "Perl Cookbook pmdesc" finden Sie articles auf anderen Q & A-Sites , mehrere Codelisten im Internet, eine Diskussion der Lösung und sogar einige Verfeinerungen

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

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

0
mpersico