Comment obtenir une liste des modules CPAN installés?


88

En plus d'essayer

perldoc <module name>

individuellement pour tout module CPAN qui me plaît ou qui passe par le système de fichiers et en regardant les répertoires, je n'ai aucune idée des modules que nous avons installés.

Quel est le moyen le plus simple d'obtenir une grande liste de tous les modules CPAN installés? Depuis la ligne de commande ou autrement.


Je peux suggérer d'utiliser les pmtools , en particulier pminst qui accepte les expressions régulières.
lukmdo

perl-pmtools est le bon outil pour vous.
jaseywang

Voulez-vous savoir quels modules sont installés ou quelles distributions sont installées?
Tim Bunce du

4
J'ai trouvé cpan -lutile pour moi sur Windows.
annulé le

1
Cela pourrait être utile:instmodsh
Ravi

Réponses:


65

Cette question est répondue dans la FAQ Perl, la réponse qui peut être trouvée rapidement avec perldoc -q installed. En bref, il s'agit d'utiliser ExtUtils::Installedou d'utiliser des File::Findvariantes des deux qui ont été couvertes précédemment dans ce fil.

Vous pouvez également trouver l'entrée FAQ "Comment trouver les modules installés sur mon système?" dans perlfaq3. Vous pouvez voir une liste de toutes les réponses à la FAQ en regardant dans perlfaq


36
Cela donne tellement plus que ce que l'OP demandait, c'est pratiquement inutile.
Justin

2
cpan -l effectue une recherche récursive dans le répertoire à partir duquel je l'exécute. Existe-t-il un moyen de passer l' option du ExtUtils::Installedconstructeur à skip_cwdpartir de cette ligne de commande?
Mark Reed

10
La FAQ dit d'utiliser cpan -lmais cela ne fonctionne pas sur RHEL6 et /usr/bin/cpan -lrenvoie l'erreur Unknown option: l.
Stefan Lasiewski

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

utilisez perldoc -t perllocal pour obtenir une sortie de texte brut, sinon grep pourrait ne pas fonctionner en raison de caractères ctrl incorporés
user333869

35
perldoc perllocal

Edit: Il y a un (peu) plus d'informations à ce sujet dans la FAQ CPAN


2
Merci pour le lien vers la FAQ. Malheureusement, tous les modules que je connais installés ne reviennent pas. Date :: Calc n'apparaît même pas là-haut.
David McLaughlin le

26

perldoc -q installed

prétend que cpan -lcela fera l'affaire, mais cela ne fonctionne pas pour moi. L'autre option:

cpan -a

crache une belle liste de paquets installés et a le bon effet secondaire de les écrire dans un fichier.


2
Pour mémoire, cpan -lfonctionne (ou fait pour moi avec CPAN v2.05). cpan -aest en effet plus jolie.
William Turrell

23

Il est à noter que perldoc perllocal ne rapportera que les modules installés via CPAN. Si quelqu'un installe les modules manuellement, il ne les trouvera pas. De plus, si plusieurs personnes installent des modules et que le perllocal.pod est sous contrôle de code source, les utilisateurs peuvent résoudre les conflits de manière incorrecte et corrompre la liste (cela s'est produit ici au travail, par exemple).

Malheureusement, la solution semble parcourir @INC avec File :: Find ou quelque chose de similaire. Cependant, cela ne permet pas seulement de trouver les modules, mais également les modules associés dans une distribution. Par exemple, il rapporterait TAP :: Harness et TAP :: Parser en plus du nom de distribution réel de Test :: Harness (en supposant que vous ayez la version 3 ou supérieure). Vous pourriez potentiellement les faire correspondre avec les noms de distribution et ignorer les noms qui ne correspondent pas, mais vous pourriez alors supprimer les modules construits et installés localement.

Je crois que le travail d'indexation de backpan de brian d foy est censé avoir du code à disposition dans le fichier .pm et il tentera de déduire la distribution, mais même cela échoue parfois parce que ce qui est dans un package n'est pas nécessairement installé (voir Devel :: Cover :: Inc pour un exemple).


1
Je ne pense pas avoir besoin de sortir les pistolets du catalogue BackPAN pour celui-là. Quelque chose comme je le fais avec Test :: Prereq pour le réduire en fonction de la distribution qu'il trouve dans 02packages pourrait suffire. C'est un peu plus compliqué que de simplement lister les fichiers du module, et le catalogue n'est pas encore près de gérer cela.
brian d foy le

2
A partir d'un test rudimentaire (faisant un "make -n install" dans certains répertoires que j'ai en train de traîner), l'étape "make install" de tout module basé sur MakeMaker mettra à jour perllocal. Ce n'est pas spécifique à l'installation via CPAN directement.
rjray le

1
Je pense que Dist :: Surveyor est toujours le meilleur outil pour répondre à la question "quelles distributions sont installées dans cette bibliothèque?". Voir cette présentation pour plus de détails. Il existe une version fatpacked facile à utiliser dans le référentiel git .
Tim Bunce du

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
cela fonctionne bien pour ceux d'entre nous qui n'ont pas installé cpan.
pdwalker

Réponse vraiment sous-estimée. Cela fonctionne également pour les distributions RHEL.
Cristina

4
J'ai eu:No documentation found for "perllocal".
Luis A. Florit

Cela a pris plus de temps que prévu (environ 20 secondes sur ma machine), mais cela a fonctionné parfaitement! Très bonne réponse.
Hans Goldman le

19

Vous pouvez essayer ExtUtils-Installed , mais cela ne regarde que dans .packlists, donc il peut manquer des modules dans lesquels les gens ont déplacé les choses à la @INCmain.

J'ai écrit App-Module-Lister pour un ami qui voulait faire cela en tant que script CGI sur un compte d'hébergement Web non shell. Il vous suffit de prendre le fichier du module et de le télécharger sous un nom de fichier que votre serveur traitera comme un script CGI. Il n'a pas de dépendances en dehors de la bibliothèque standard. Utilisez-le tel quel ou volez le code.

Il sort une liste des modules et de leurs versions:

Cravate :: Cycle 1.15
Cravate :: IxHash 1.21
Cravate :: Toggle 1.07
Cravate :: ToObject 0.03
Heure :: CTime 99.062201
Temps :: DaysInMonth 99.1117
Temps :: Epoque 0.02
Temps :: Fuzzy 0.34
Heure :: JulianDay 2003.1125
Heure :: ParseDate 2006.0814
Heure :: Fuseau horaire 2006.0814

Je voulais ajouter cela en tant que fonctionnalité à l' cpanoutil, alors je le ferai aussi. [Le temps passe] Et maintenant j'ai un -linterrupteur cpan. J'ai quelques autres choses à faire avec avant de faire une sortie, mais c'est dans github . Si vous ne voulez pas attendre cela, vous pouvez simplement essayer le -acommutateur pour créer un groupage automatique, bien que cela place un pod dans la liste.

Bonne chance;


12

Voici un script qui ferait l'affaire:

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

Sous RHEL 6.9, ces scripts n'impriment que les éléments suivants: Les Perl - 5.10.1 modules ne sont pas répertoriés.
Hans Deragon

9

J'aime utiliser la commande CPAN «r» pour cela. Vous pouvez entrer dans le shell CPAN avec l'ancien style:

sudo perl -MCPAN -e shell

ou, sur la plupart des systèmes plus récents, il existe une commande 'cpan', donc cette commande vous mènera au shell:

sudo cpan

(Vous devez généralement utiliser 'sudo' pour l'exécuter en tant qu'utilisateur root, ou utiliser 'su -' pour devenir root avant de l'exécuter, sauf si vous avez configuré cpan pour vous permettre de l'exécuter en tant qu'utilisateur normal, mais de l'installer en tant qu'utilisateur root. Si vous n'avez pas de root sur cette machine, vous pouvez toujours utiliser le shell CPAN pour trouver ces informations, mais vous ne pourrez pas installer de modules, et vous devrez peut-être effectuer un peu de configuration la première fois que vous exécuter.)

Ensuite, une fois que vous êtes dans le shell cpan, vous pouvez utiliser la commande 'r' pour signaler tous les modules installés et leurs versions. Donc, à l'invite «cpan>», tapez «r». Cela listera tous les modules installés et leurs versions. Utilisation '?' pour obtenir plus d’aide.


1
en fait, «r» vous donne les recommandations de réinstallation - c'est-à-dire tous les modules de votre installation qui ont une version plus récente de CPAN. À moins que votre installation ne soit très obsolète, cette liste ne sera pas complète.
EvdB le

Mon «r» rapporte toujours presque rien parce que je mets à jour de manière compulsive. Ce qui me rappelle ... Je n'ai pas encore mis à jour aujourd'hui.
skiphoppy le

3
Le -r recompile des éléments. Pour obtenir une liste, essayez -a ou téléchargez les dernières sources et jouez avec le nouveau commutateur -l, ajouté uniquement pour cette réponse. :)
brian d foy

1
Pourquoi sudoici? C'est complètement inutile.
Aristotle Pagaltzis

2
notez la différence entre l'argument de ligne de commande '-r' de 'cpan' et la commande 'r' dans le shell cpan :)
EvdB

7

Voici une façon vraiment pirate de le faire dans * nix, vous obtiendrez des choses dont vous ne vous souciez pas vraiment (par exemple: warnings :: register etc.), mais cela devrait vous donner une liste de tous les fichiers .pm accessibles via perl.


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


2
Cela ne lui donnera pas ce qu'il veut. Il ne regroupera pas les fichiers associés selon la distribution dont ils font partie, et il listera tous les fichiers * .pm de base de Perl lui-même.
rjray

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

C'est très bien car cela montre clairement le chemin complet vers chaque *.pmmodule. Vous pouvez voir de nombreux doublons ...
not2qubit

7

Vous pouvez obtenir la liste des modules perl installés dans votre système en utilisant la instmodshcommande dans votre terminal.Il vous demandera trois options afin d'améliorer la sortie qu'ils sont:

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

5

Sous Linux / Unix, j'utilise cette commande simple:

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

Il scanne tous les dossiers @INCet recherche tout fichier * .pm.


Merci! Très utile.
not2qubit

Merci! C'est peut-être le plus perl que j'ai jamais appris avec une expression aussi succincte.
ewd le




1

J'ai écrit un script perl hier pour faire exactement cela. Le script renvoie la liste des modules Perl installés dans @INC en utilisant le '::' comme séparateur. Appelez le script en utilisant -

perl perlmod.pl

OU

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

À partir de maintenant, le script ignore le répertoire actuel ('.') Car j'avais des problèmes avec les liens logiciels récurrents, mais vous pouvez l'inclure en modifiant la fonction grep à la ligne 17 de

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

pour juste,

@INC

Le script peut être trouvé ici.



1

Pour parcourir les arborescences de répertoires @INC sans utiliser un programme externe comme ls (1), on pourrait utiliser le File::Find::Rulemodule, qui a une belle interface déclarative.

De plus, vous voulez filtrer les doublons au cas où les versions précédentes de Perl contiendraient les mêmes modules. Le code pour faire cela ressemble à:

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

À la fin de l'exécution, vous avez également tous les noms de vos modules sous forme de clés dans le hachage% vu. Le code pourrait être adapté pour enregistrer le nom de fichier canonique (donné dans $ file) comme valeur de la clé au lieu d'un nombre de fois vu.


1

Ce qui suit a fonctionné pour moi.

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

1

Tous ceux qui ne peuvent pas installer perldoc, ou d'autres modules, et veulent savoir quels modules sont disponibles (CPAN ou autre), les suivants fonctionnent pour linux et Mingw32 / 64:

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

Oui, c'est compliqué. Oui, il en rapporte probablement plus que vous ne le souhaitez. Mais si vous le dirigez dans un fichier, vous pouvez facilement vérifier, par exemple, quelles interfaces dbm sont présentes:

 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;

C'est pourquoi je me suis retrouvé sur cette page (déçu)

(Je me rends compte que cela ne répond pas exactement à la question du PO, mais je la poste pour quiconque s'est retrouvé ici pour la même raison que moi. C'est le problème avec stack *** il est presque impossible de trouver la question que vous demander, même s'il existe, mais stack *** est presque toujours le premier succès de Google!)


Cela a fonctionné pour moi. Merci d'avoir publié ceci. J'en avais besoin dans un environnement où je n'ai pas beaucoup d'accès pour installer / mettre à jour les dépendances.
Ashish Kumar


0

Voici un one-liner Perl qui imprimera une liste des modules installés:

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

Assurez-vous simplement que Data :: Dumper est installé.


2
Cela ne répertorie qu'environ 15 modules perl, au lieu des 5945 listés par «cpan -l».
Paul Tomblin le

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

Les utilisateurs Windows effectuent simplement une recherche dans l'Explorateur Windows pour le trouver.


0

Essayez "perldoc -l":

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


0

Voici un script de @ JamesThomasMoon1979 réécrit en une seule ligne

perl -MExtUtils::Installed -e '$i=ExtUtils::Installed->new(); 
      print "$_ ".$i->version($_)."\n" for $i->modules();'

-1

Lorsque vous entrez votre script Perl, vous avez tous les modules installés sous forme de fichiers .pm sous les dossiers de @INC, donc un petit script bash fera le travail pour vous:

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

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

-2

Pour Linux, le moyen le plus simple d'obtenir est,

dpkg -l | grep "perl"

1
l'OP a demandé une liste des modules CPAN (perl) installés dans le système, pas si perl est installé dans le système (ni l'OP ne nous a dit si apt est disponible)
ROLO

Je ne suis pas un expert en perl mais j'ai vu des modules perl installés à partir de la commande ci-dessus. Peut-être pas la réponse parfaite ici.
Yasiru G

-2

Cela fonctionne pour moi

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

Merci pour cet extrait de code, qui pourrait fournir une aide limitée et immédiate. Une explication appropriée améliorerait considérablement sa valeur à long terme en montrant pourquoi c'est une bonne solution au problème, et la rendrait plus utile aux futurs lecteurs avec d'autres questions similaires. Veuillez modifier votre réponse pour ajouter des explications, y compris les hypothèses que vous avez formulées.
Machavity

-3

Voici ce que je fais: perl -M{cpan_module}
si vous ne recevez aucune erreur, il y a de fortes chances que le module soit installé.


2
Je ne pense pas que cela réponde à la question. En utilisant cette suggestion, cela pourrait prendre un certain temps à quelqu'un pour parcourir module par module pour découvrir quels modules sont installés ou non.
Dave Newman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.