Comment puis-je obtenir une liste des modules CPAN installés?

En plus d’essayer

perldoc  

individuellement pour tout module CPAN qui prend mon fantaisie ou passe par le système de fichiers et examine les répertoires Je n’ai aucune idée de quels modules nous avons installés.

Quelle est la manière la plus simple de simplement obtenir une grande liste de tous les modules CPAN installés? De la ligne de commande ou autre.

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 à l’aide de File::Find , des variantes qui ont déjà été abordées dans ce fil de discussion.

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

 perldoc perllocal 

Edit: Il y a un (petit) plus d’informations à ce sujet dans la FAQ de CPAN

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

Malheureusement, la solution semble traverser @INC avec File :: Find ou quelque chose de similaire. Cependant, cela ne fait pas que trouver les modules, il trouve également des modules associés dans une dissortingbution. Par exemple, il signalerait TAP :: Harness et TAP :: Parser en plus du nom de dissortingbution actuel de Test :: Harness (en supposant que vous ayez la version 3 ou supérieure). Vous pourriez éventuellement les associer à des noms de dissortingbution et ignorer ceux qui ne correspondent pas, mais vous pourriez alors supprimer des modules construits et installés localement.

Je crois que le travail d’indexation de backpan de Brian d foy est supposé avoir du code pour le transmettre au fichier .pm et il tentera d’inférer la dissortingbution, mais même cela échoue parfois parce que ce qui est dans un paquet n’est pas nécessairement installé (voir Devel :: Cover :: Inc pour un exemple).

Vous pouvez essayer ExtUtils-Installed , mais cela ne regarde que dans .packlist , il peut donc manquer des modules que les gens ont déplacés dans @INC à la main.

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. Vous devez simplement prendre le fichier de module et le télécharger en tant que nom de fichier que votre serveur traitera comme un script CGI. Il n’y a pas de dépendances en dehors de la bibliothèque standard. Utilisez-le tel quel ou volez le code.

Il produit une liste des modules et de leurs versions:

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

Je voulais append ceci comme une fonctionnalité à l’outil cpan , donc je le ferai aussi. [Le temps passe] Et maintenant, j’ai un commutateur -l dans cpan . J’ai quelques autres choses à faire avec ça avant de faire une sortie, mais c’est dans github . Si vous ne voulez pas attendre, vous pouvez simplement essayer le commutateur -a pour créer un autobundle, bien que cela place un pod dans la liste.

Bonne chance;

perldoc -q installed

affirme que cpan -l 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 pour effet secondaire de les écrire dans un fichier.

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

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 nouveaux systèmes, il y a une commande ‘cpan’, donc cette commande vous amènera au shell:

 sudo cpan 

(Vous devez généralement utiliser ‘sudo’ pour l’exécuter en tant que root, ou utiliser ‘su -‘ pour devenir root avant de l’exécuter, à moins que cpan ne soit configuré pour vous permettre de l’exécuter en tant qu’utilisateur normal, mais en tant qu’utilisateur root. Si vous n’avez pas 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 quelques réglages exécuter.)

Ensuite, une fois 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 de l’aide supplémentaire.

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  -  =cut 

Voici une façon vraiment géniale de le faire dans * nix, vous obtiendrez des éléments qui ne vous intéressent pas vraiment (par exemple: warnings :: register, etc.), mais il 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; } }
for my $path (@INC) { my @list = `ls -R $path/**/*.pm`; for (@list) { s/$path\///g; s/\//::/g; s/\.pm$//g; print; } } 

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

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

La réponse se trouve dans la liste des questions fréquentes de Perl .

Vous devriez parcourir l’excellente documentation fournie avec Perl

 perldoc perltoc 

Essayez l’ man perllocal ou perldoc perllocal .

Voici un one-liner de 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 que vous avez installé Data :: Dumper.

Essayez la commande suivante

instmodsh

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

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 séparateur “::”. Appelez le script en utilisant –

 perl perlmod.pl 

OU

 perl perlmod.pl  #Case-insensitive(eg. perl perlmod.pl ftp) 

A partir de maintenant, le script ignore le répertoire en cours (‘.’) Car je rencontrais des problèmes avec les liens logiciels récursifs, mais vous pouvez l’inclure en modifiant la fonction grep de la ligne 17 à partir de

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

pour juste,

 @INC 

Le script peut être trouvé ici.

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

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

  • Portable (n’utilise que des modules de base)
  • Option de cache pour des recherches plus rapides
  • Options d’affichage configurables

Pour parcourir les arborescences de répertoire @INC sans utiliser de programme externe tel que ls (1), on pourrait utiliser le module File::Find::Rule , qui a une belle interface déclarative.

De plus, vous souhaitez 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 ssortingct; 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 en tant que clés dans le hash% vu. Le code pourrait être adapté pour enregistrer le nom de fichier canonique (donné dans le fichier $) comme valeur de la clé au lieu du nombre de fois vu.

Le livre de recettes Perl contient plusieurs itérations d’un script “pmdesc” qui fait ce que vous voulez. Recherchez “Perl Cookbook pmdesc” sur Google et vous trouverez des articles sur d’autres sites , plusieurs listes de codes sur le net, une discussion sur la solution et même des améliorations .

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

Les utilisateurs de Windows font simplement une recherche dans Windows Explorer pour le trouver.

Ce qui suit a fonctionné pour moi.

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

Lorsque vous entrez votre script Perl, vous avez tous les modules installés en tant que 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 

Cela fonctionne pour moi

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

Utilisez perldoc -q installé pour plus d’informations ou tapez simplement

 perldoc  

Pour Linux, le moyen le plus simple est de:

 dpkg -l | grep "perl" 

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é.