web-dev-qa-db-fra.com

Comment obtenir une liste des modules CPAN installés?

En plus d'essayer

perldoc <module name>

individuellement pour chaque module CPAN qui me plait ou passe en revue le système de fichiers et les répertoires, je ne sais pas du tout quels modules nous avons installés. 

Quel est le moyen le plus simple d’obtenir une grande liste de tous les modules CPAN installés? En ligne de commande ou autre.

80
David McLaughlin

Ceci est répondu dans la FAQ Perl, la réponse qui peut être rapidement trouvée avec perldoc -q installed. En bref, cela revient à utiliser ExtUtils::Installed ou à utiliser File::Find, des variantes des deux qui ont déjà été abordées dans ce fil de discussion.

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

63
pjf
perldoc perllocal

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

33
Dan

perldoc -q installed

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

cpan -a

crache une liste de Nice des paquets installés et a pour effet de Nice de les écrire dans un fichier.

24
Paul Rubel

Il est à noter que perldoc perllocal ne rend compte que des modules installés via CPAN. Si quelqu'un installe les modules manuellement, il ne les trouvera pas. De même, si plusieurs personnes installent des modules et que perllocal.pod est sous contrôle de source, il est possible que les personnes résolvent les conflits de manière incorrecte et corrompent la liste (c'est ce qui s'est passé ici au travail, par exemple).

Malheureusement, la solution semble être en train de parcourir @INC avec File :: Find ou quelque chose de similaire. Cependant, cela ne concerne pas uniquement les modules, il recherche également les modules associés dans une distribution. Par exemple, il signalerait TAP :: Harness et TAP :: Parser en plus du nom de distribution réel de Test :: Harness (en supposant que vous disposiez de la version 3 ou supérieure). Vous pouvez éventuellement les associer à des noms de distribution et supprimer ceux qui ne correspondent pas, mais vous pouvez également supprimer les modules créés et installés localement.

Je pense que le travail d’indexation de la face arrière de brian d foy est supposé avoir du code pour le remettre au fichier .pm et il tentera de déduire la distribution, mais cela échoue parfois car le contenu d’un paquet n’est pas nécessairement installé (voir :: Inc pour un exemple).

23
Ovid

Vous pouvez essayer ExtUtils-Installed , mais cela ne regarde que dans .packlists, de sorte qu'il peut manquer des modules pour lesquels des personnes ont déplacé des éléments dans @INC à la main.

J'ai écrit App-Module-Lister pour un ami qui voulait le faire en tant que script CGI sur un compte d'hébergement Web autre que Shell. Vous prenez simplement le fichier de module et le chargez en tant que 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 leurs versions:

 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 

Je voulais ajouter cela en tant que fonctionnalité à l'outil cpan, je vais donc le faire aussi. [Le temps passe] Et maintenant, j'ai un commutateur -l dans cpan. J'ai quelques autres choses à faire avec cela avant de faire une sortie, mais c'est en github . Si vous ne voulez pas attendre pour cela, vous pouvez simplement essayer le commutateur -a pour créer un regroupement automatique, bien que cela mette un certain Pod à la liste.

Bonne chance;

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

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

J'aime utiliser la commande 'r' CPAN 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', cette commande vous permet donc d'accéder au shell:

Sudo cpan

(Vous devez généralement utiliser 'Sudo' pour l'exécuter en tant que root ou 'su -' pour devenir root avant de l'exécuter, sauf si cpan est configuré pour vous permettre de l'exécuter en tant qu'utilisateur normal, mais installez-le en tant que root. Si vous ne disposez pas de root sur cette machine, vous pouvez toujours utiliser le shell CPAN pour obtenir ces informations, mais vous ne pourrez pas installer de modules et vous devrez peut-être effectuer une configuration un peu la première fois. 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. Ainsi, à l'invite "cpan>", tapez "r". Ceci listera tous les modules installés et leurs versions. Utilisation '?' pour obtenir plus d'aide.

9
amoore

Voici une façon très astucieuse de le faire dans * nix, vous obtiendrez des choses qui ne vous intéressent pas vraiment (par exemple: warnings :: register etc.), mais il devrait vous donner une liste de chaque fichier .pm accessible via Perl.


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

Vous pouvez obtenir la liste des modules Perl installés dans votre système en utilisant la commande instmodsh de votre terminal. Il vous demandera trois options pour améliorer le résultat: 

   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

La réponse se trouve dans la liste Perl FAQ .

Vous devriez feuilleter l'excellente documentation fournie avec Perl

perldoc perltoc
2
Sinan Ünür

Essayez man perllocal ou perldoc perllocal.

2
Walter H

Voici un document Perl one-liner 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
thealexbaron

Essayez la commande suivante

instmodsh

2
user2024286

Pour parcourir les arborescences de répertoires @INC sans utiliser de programme externe comme ls (1), vous pouvez utiliser le module File::Find::Rule, qui possède une interface déclarative Nice.

Vous souhaitez également éliminer les doublons si les versions précédentes de Perl contiennent 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% seen. Le code pourrait être adapté pour enregistrer le nom de fichier canonique (donné dans $ file) en tant que valeur de la clé au lieu du nombre de fois vu.

1
dland

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 "::" comme séparateur. Appelez le script en utilisant - 

Perl perlmod.pl

OU 

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

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

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

pour juste,

@INC

Le script peut être trouvé ici.

1
aks

Voici encore un autre outil de ligne de commande pour répertorier tous les fichiers .pm installés:

Trouver les modules Perl installés correspondant à une expression régulière

  • Portable (utilise uniquement des modules de base)
  • Option de cache pour des recherches plus rapides
  • Options d'affichage configurables
1
toolic

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

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

Il analyse tous les dossiers dans @INC et recherche tous les fichiers * .pm.

1
Wernfried Domscheit

Lorsque vous entrez dans votre script Perl, vous avez tous les modules installés sous forme de fichiers .pm sous les dossiers de @INC. 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
0
Henrik

Ce qui suit a fonctionné pour moi.

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

le livre de recettes Perl contient plusieurs itérations du script "pmdesc" qui fait ce que vous voulez. Sur Google, recherchez "Perl Cookbook pmdesc" et vous trouverez des articles sur d'autres sites de questions-réponses , plusieurs listes de codes sur le net, une discussion de la solution, et même quelques améliorations

0
knb
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
mpersico