Como obtenho uma lista dos módulos CPAN instalados?


90

Além de tentar

perldoc <module name>

individualmente para qualquer módulo CPAN que me agrade, ou examinando o sistema de arquivos e olhando os diretórios, não tenho ideia de quais módulos instalamos.

Qual é a maneira mais fácil de obter uma grande lista de cada módulo CPAN instalado? Da linha de comando ou de outra forma.


Posso sugerir o uso de pmtools , especialmente pminst, que aceita expressões regulares.
lukmdo

perl-pmtools é uma boa ferramenta para você.
jaseywang

Você quer saber quais módulos estão instalados, ou quais distribuições estão instaladas?
Tim Bunce

4
Achei cpan -lútil para mim no Windows.
vazio em

1
Isso pode ser útil:instmodsh
Ravi de

Respostas:


67

Isso é respondido no FAQ do Perl, cuja resposta pode ser encontrada rapidamente com perldoc -q installed. Resumindo, tudo se resume a usar ExtUtils::Installedou usar File::Find, variantes de ambos que foram abordadas anteriormente neste tópico.

Você também pode encontrar a entrada da FAQ "Como descubro quais módulos estão instalados em meu sistema?" em perlfaq3. Você pode ver uma lista de todas as respostas do FAQ procurando em perlfaq


36
Isso dá muito mais do que o OP solicitou que é praticamente inútil.
Justin

2
cpan -l está fazendo uma pesquisa recursiva em qualquer diretório de onde eu o executo. Existe alguma maneira de passar a opção ExtUtils::Installeddo construtor a skip_cwdpartir dessa linha de comando?
Mark Reed de

10
O FAQ diz para usar, cpan -lmas isso não funciona no RHEL6 e /usr/bin/cpan -lgera o erro Unknown option: l.
Stefan Lasiewski

1
$ perldoc perllocal | Módulo grep $ perldoc perllocal | grep -E 'VERSÃO | Módulo'
caot em

use perldoc -t perllocal para obter a saída de texto simples, caso contrário, o grep pode não funcionar devido aos caracteres ctrl incorporados
user333869

35
perldoc perllocal

Edit: Há um (pouco) mais informações sobre isso no CPAN FAQ


2
Obrigado pelo link para o FAQ. Infelizmente, nem todos os módulos que sei que estão instalados estão retornando. Date :: Calc nem aparece aí.
David McLaughlin

26

perldoc -q installed

afirma que cpan -lresolverá o problema, mas não está funcionando para mim. A outra opção:

cpan -a

expulsa uma boa lista de pacotes instalados e tem o efeito colateral agradável de gravá-los em um arquivo.


2
Para registro, cpan -lfunciona (ou funciona para mim com o CPAN v2.05). cpan -aé realmente mais bonito.
William Turrell

23

É importante notar que perldoc perllocal reportará apenas em módulos instalados via CPAN. Se alguém instalar os módulos manualmente, não os encontrará. Além disso, se você tiver várias pessoas instalando módulos e o perllocal.pod estiver sob controle de origem, as pessoas podem resolver os conflitos incorretamente e corromper a lista (isso aconteceu aqui no trabalho, por exemplo).

Infelizmente, a solução parece estar percorrendo @INC com File :: Find ou algo semelhante. No entanto, isso não localiza apenas os módulos, também encontra módulos relacionados em uma distribuição. Por exemplo, ele relataria TAP :: Harness e TAP :: Parser além do nome real da distribuição de Test :: Harness (assumindo que você tenha a versão 3 ou superior). Você poderia potencialmente combiná-los com nomes de distribuição e descartar aqueles nomes que não combinam, mas então você pode estar descartando módulos construídos e instalados localmente.

Acredito que o trabalho de indexação backpan de brian d foy deve ter código para entregá-lo no arquivo .pm e tentará inferir a distribuição, mas mesmo isso às vezes falha porque o que está em um pacote não está necessariamente instalado (consulte Devel :: Cover :: Inc para um exemplo).


1
Eu não acho que preciso tirar as armas do catálogo BackPAN para isso. Algo como eu faço com Test :: Prereq para recolhê-lo por qual distro ele encontra em 02packages pode ser o suficiente. Isso é um pouco mais complicado do que apenas listar os arquivos do módulo, e o catálogo ainda não está perto de lidar com isso.
brian d foy

2
A partir de um teste rudimentar (fazendo um "make -n install" em alguns diretórios que tenho por aí), a etapa "make install" de qualquer módulo baseado em MakeMaker atualizará perllocal. Não é específico para instalar via CPAN diretamente.
rjray

1
Acho que o Dist :: Surveyor ainda é a melhor ferramenta para responder à pergunta "quais distribuições estão instaladas nessa biblioteca?". Veja esta apresentação para mais detalhes. Há uma versão fatpacked fácil de usar no repositório git .
Tim Bunce

21
$ 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
isso funciona muito bem para aqueles de nós que não têm o cpan instalado.
pdwalker

Resposta realmente subestimada. Isso também funciona para distribuições RHEL.
Cristina

5
Recebi:No documentation found for "perllocal".
Luis A. Florit

Demorou mais para ser executado do que eu esperava (cerca de 20 segundos ou mais na minha máquina), mas funcionou perfeitamente! Ótima resposta.
Hans Goldman

20

Você pode tentar ExtUtils-Installed , mas ele só olha em .packlists, então pode faltar módulos para os quais as pessoas movem as coisas @INCmanualmente.

Escrevi App-Module-Lister para um amigo que queria fazer isso como um script CGI em uma conta de hospedagem web não shell. Você simplesmente pega o arquivo do módulo e carrega-o como um nome de arquivo que seu servidor tratará como um script CGI. Não tem dependências fora da Biblioteca Padrão. Use-o como está ou roube o código.

Ele produz uma lista dos módulos e suas versões:

Empate :: Ciclo 1.15
Empate :: IxHash 1.21
Tie :: Toggle 1.07
Tie :: ToObject 0,03
Tempo :: CTime 99.062201
Time :: DaysInMonth 99.1117
Tempo :: Época 0,02
Tempo :: Fuzzy 0,34
Hora :: JulianDay 2003.1125
Time :: ParseDate 2006.0814
Time :: Timezone 2006.0814

Tenho pretendido adicionar isso como um recurso à cpanferramenta, então farei isso também. [O tempo passa] E, agora eu tenho um -linterruptor cpan. Tenho algumas outras coisas a fazer com ele antes de fazer um lançamento, mas está no github . Se você não quiser esperar por isso, pode simplesmente tentar o -aswitch para criar um agrupamento automático, embora isso coloque alguns Pod em torno da lista.

Boa sorte;


13

Aqui está um script que faria o truque:

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

No RHEL 6.9, este script imprime apenas o seguinte: Perl - 5.10.1 Módulos não listados.
Hans Deragon

9

Eu gosto de usar o comando 'r' do CPAN para isso. Você pode entrar no shell CPAN com o estilo antigo:

sudo perl -MCPAN -e shell

ou, na maioria dos sistemas mais recentes, há um comando 'cpan', portanto, este comando o levará ao shell:

sudo cpan

(Você normalmente tem que usar 'sudo' para executá-lo como root ou usar 'su -' para se tornar root antes de executá-lo, a menos que você tenha o cpan configurado para permitir que você execute-o como um usuário normal, mas instale como root. Se você não tem root nesta máquina, você ainda pode usar o shell CPAN para descobrir esta informação, mas você não será capaz de instalar os módulos, e você pode ter que passar por algumas configurações na primeira vez que executá-lo.)

Então, uma vez no shell cpan, você pode usar o comando 'r' para relatar todos os módulos instalados e suas versões. Portanto, no prompt "cpan>", digite 'r'. Isso listará todos os módulos instalados e suas versões. Usar '?' para obter mais ajuda.


1
na verdade, 'r' fornece as recomendações de reinstalação - ou seja, todos os módulos em sua instalação que possuem uma versão mais recente do CPAN. A menos que sua instalação esteja muito desatualizada, esta não será uma lista completa.
EvdB de

Meu 'r' sempre reporta quase nada porque eu atualizo compulsivamente. O que me lembra ... Eu não atualizei hoje, ainda.
skiphoppy

3
O -r recompila o material. Para obter uma lista, tente -a ou baixe as fontes mais recentes e brinque com a nova opção -l, adicionada apenas para esta resposta. :)
brian d foy

1
Por que sudoaqui? É completamente desnecessário.
Aristóteles Pagaltzis

2
observe a diferença entre o argumento da linha de comando '-r' para 'cpan' e o comando 'r' no shell cpan :)
EvdB

7

Esta é uma maneira realmente hacky de fazer isso em * nix, você obterá algumas coisas com as quais realmente não se preocupa (por exemplo: warnings :: register etc), mas deve fornecer uma lista de todos os arquivos .pm que podem ser acessados ​​via perl.


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


2
Isso não vai dar a ele o que ele quer. Ele não agrupará os arquivos relacionados pela distribuição da qual fazem parte e listará todos os arquivos * .pm principais do próprio Perl.
rjray

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

Isso é muito bom, pois mostra claramente o caminho completo para cada *.pmmódulo. Você pode ver muitas duplicatas ...
not2qubit

7

Você pode obter uma lista de módulos perl instalados em seu sistema usando o instmodshcomando em seu terminal. Ele irá pedir-lhe três opções para melhorar a saída são:

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

6

No Linux / Unix, uso este comando simples:

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

Ele verifica todas as pastas @INCe procura qualquer arquivo * .pm.


Obrigado! Muito útil.
not2qubit

Obrigado! Essa é talvez a mais perl que já aprendi com uma expressão tão sucinta.
ewd


2

A resposta pode ser encontrada na lista Perl FAQ .

Você deve dar uma olhada na excelente documentação que vem com o Perl

perldoc perltoc


2

Todos aqueles que não podem instalar o perldoc, ou outros módulos, e querem saber quais módulos estão disponíveis (CPAN ou outro), o seguinte funciona para linux e Mingw32 / 64:

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

Sim, está bagunçado. Sim, provavelmente reporta mais do que você deseja. Mas se você canalizá-lo em um arquivo, poderá verificar facilmente, digamos, quais interfaces dbm estão presentes:

 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;

É por isso que acabei nesta página (decepcionado)

(Eu sei que isso não responde exatamente à pergunta do OP, mas estou postando para qualquer um que acabou aqui pelo mesmo motivo que eu fiz. Esse é o problema com pilha *** é quase impossível encontrar a pergunta que você está perguntando, mesmo quando existe, mas stack *** é quase sempre o maior hit do Google!)


Isso funcionou para mim. Obrigado por postar isso. Eu precisava disso em um ambiente onde não tenho muito acesso para instalar / atualizar quaisquer dependências.
Ashish Kumar

1

Eu escrevi um script perl ontem para fazer exatamente isso. O script retorna a lista de módulos perl instalados em @INC usando '::' como separador. Chame o script usando -

perl perlmod.pl

OU

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

A partir de agora, o script pula o diretório atual ('.'), Pois eu estava tendo problemas com links de software recorrentes, mas você pode incluí-lo alterando a função grep na linha 17 de

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

para apenas,

@INC

O script pode ser encontrado aqui.



1

Para percorrer as árvores de diretório @INC sem usar um programa externo como ls (1), pode-se usar o File::Find::Rulemódulo, que tem uma interface declarativa agradável.

Além disso, você deseja filtrar as duplicatas caso as versões anteriores do Perl contenham os mesmos módulos. O código para fazer isso se parece com:

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

No final da execução, você também terá todos os nomes de seus módulos como chaves no hash% seen. O código pode ser adaptado para salvar o nome do arquivo canônico (fornecido em $ file) como o valor da chave em vez de uma contagem de vezes visto.


1

O seguinte funcionou para mim.

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

1

Aqui está um roteiro de @ JamesThomasMoon1979 reescrito como uma linha

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


0

Aqui está um one-liner Perl que imprimirá uma lista dos módulos instalados:

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

Apenas certifique-se de que o Data :: Dumper esteja instalado.


2
Isso lista apenas cerca de 15 módulos perl, em vez dos 5945 que 'cpan -l' lista.
Paul Tomblin

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

Os usuários do Windows apenas fazem uma pesquisa no Windows Explorer para encontrá-lo.


0

Experimente "perldoc -l":

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


-1

Ao inserir seu script Perl, você terá todos os módulos instalados como arquivos .pm abaixo das pastas em @INC, portanto, um pequeno script bash fará o trabalho para você:

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

Por que não? find `perl -le'print for@INC'` -name '*.pm'
Hynek -Pichi- Vychodil

-2

Para Linux, a maneira mais fácil de obter é,

dpkg -l | grep "perl"

1
o OP pediu uma lista de módulos CPAN (perl) instalados no sistema, não se o perl está instalado no sistema (nem o OP nos informou se o apt está disponível)
ROLO

Não sou um especialista em perl, mas vi módulos perl instalados a partir do comando acima. Pode não ser a resposta perfeita aqui.
Yasiru G

@YasiruG só lista aqueles que foram instalados por meio de pacotes; isso é uma minoria em qualquer instalação. A maioria deles é instalada via CPAN.
jjmerelo

-2

Isso funciona para mim

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

Obrigado por este trecho de código, que pode fornecer alguma ajuda limitada e imediata. Uma explicação adequada melhoraria muito seu valor a longo prazo , mostrando por que essa é uma boa solução para o problema, e a tornaria mais útil para futuros leitores com outras questões semelhantes. Por favor edite sua resposta para adicionar alguma explicação, incluindo as suposições que você fez.
Machavity

-3

Isto é o que eu faço: perl -M{cpan_module}
Se você não receber nenhum erro, há uma boa chance de que o módulo esteja instalado.


2
Não acredito que isso responda à pergunta. Usando essa sugestão, alguém pode levar algum tempo para percorrer módulo por módulo para descobrir quais módulos estão instalados ou não.
Dave Newman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.