Bagaimana cara mendapatkan daftar modul CPAN yang terinstal?


90

Selain mencoba

perldoc <module name>

secara individual untuk setiap modul CPAN yang saya sukai atau melalui sistem file dan melihat direktori Saya tidak tahu modul apa yang telah kami instal.

Apa cara termudah untuk mendapatkan daftar besar dari setiap modul CPAN yang diinstal? Dari baris perintah atau sebaliknya.


Saya dapat menyarankan menggunakan pmtools , terutama pminst yang menerima ekspresi reguler.
lukmdo

perl-pmtools adalah alat yang tepat untuk Anda.
jaseywang

Apakah Anda ingin mengetahui modul apa saja yang diinstal, atau distribusi apa yang diinstal?
Tim Bunce

4
Saya merasa cpan -lberguna untuk diri saya sendiri di windows.
batal

1
Ini mungkin berguna:instmodsh
Ravi

Jawaban:


67

Ini dijawab di Perl FAQ, jawaban yang dapat ditemukan dengan cepat perldoc -q installed. Singkatnya, ini tergantung pada penggunaan ExtUtils::Installedatau penggunaan File::Find, varian keduanya telah dibahas sebelumnya di utas ini.

Anda juga dapat menemukan entri FAQ "Bagaimana cara menemukan modul mana yang diinstal pada sistem saya?" di perlfaq3. Anda dapat melihat daftar semua jawaban FAQ dengan melihat di perlfaq


36
Ini memberikan lebih dari yang diminta OP sehingga hampir tidak berguna.
Justin

2
cpan -l sedang melakukan pencarian rekursif dari direktori manapun saya menjalankannya. Apakah ada cara untuk melewatkan opsi ExtUtils::Installedkonstruktor skip_cwddari baris perintah itu?
Mark Reed

10
FAQ mengatakan untuk menggunakan cpan -ltetapi itu tidak berfungsi pada RHEL6, dan /usr/bin/cpan -lmenampilkan kesalahan Unknown option: l.
Stefan Lasiewski

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

gunakan perldoc -t perllocal untuk mendapatkan keluaran teks biasa, jika tidak, grep mungkin tidak berfungsi karena karakter ctrl yang disematkan
pengguna333869

35
perldoc perllocal

Sunting: Ada (sedikit) info lebih lanjut tentang itu di FAQ CPAN


2
Terima kasih untuk tautan ke FAQ. Sayangnya tidak semua modul yang saya tahu terinstal kembali. Tanggal :: Calc bahkan tidak muncul di sana.
David McLaughlin

26

perldoc -q installed

klaim yang cpan -lakan melakukan trik, namun itu tidak berhasil untuk saya. Opsi lainnya:

cpan -a

tidak memuntahkan daftar paket yang terinstal dan memiliki efek samping yang bagus dari menulisnya ke file.


2
Sebagai catatan, cpan -lbekerja (atau untuk saya dengan CPAN v2.05). cpan -amemang lebih cantik.
William Turrell

23

Perlu dicatat bahwa perldoc perllocal hanya akan melaporkan modul yang dipasang melalui CPAN. Jika seseorang menginstal modul secara manual, itu tidak akan menemukannya. Selain itu, jika Anda memiliki beberapa orang yang menginstal modul dan perllocal.pod berada di bawah kendali sumber, orang-orang mungkin salah menyelesaikan konflik dan merusak daftar (ini telah terjadi di sini di tempat kerja, misalnya).

Sayangnya, solusi tersebut tampaknya berjalan melalui @INC dengan File :: Find atau yang serupa. Namun, itu tidak hanya menemukan modul, tetapi juga menemukan modul terkait dalam distribusi. Misalnya, ini akan melaporkan TAP :: Harness dan TAP :: Parser selain nama distribusi sebenarnya dari Test :: Harness (dengan asumsi Anda memiliki versi 3 atau lebih tinggi). Anda berpotensi mencocokkannya dengan nama distribusi dan membuang nama yang tidak cocok, tetapi kemudian Anda mungkin membuang modul yang dibuat dan diinstal secara lokal.

Saya percaya pekerjaan pengindeksan backpan brian d foy seharusnya memiliki kode untuk diserahkan pada file .pm dan akan mencoba menyimpulkan distribusinya, tetapi bahkan ini kadang-kadang gagal karena apa yang ada di dalam paket belum tentu diinstal (lihat Devel :: Cover :: Inc misalnya).


1
Saya tidak berpikir saya perlu mengeluarkan senjata katalog BackPAN untuk yang satu itu. Sesuatu seperti yang saya lakukan dengan Test :: Prereq untuk menutupnya dengan distro apa yang ditemukannya di 02packages mungkin cukup. Itu sedikit lebih rumit daripada hanya mencantumkan file modul, dan katalog belum dekat untuk menanganinya.
brian d foy

2
Dari tes yang belum sempurna (melakukan "make -n install" di beberapa direktori yang telah saya gunakan), langkah "make install" dari setiap modul berbasis MakeMaker akan memperbarui perllocal. Ini tidak spesifik untuk menginstal melalui CPAN secara langsung.
rjray

1
Saya pikir Dist :: Surveyor masih merupakan alat terbaik untuk menjawab pertanyaan " distribusi apa yang diinstal di perpustakaan itu?". Lihat presentasi ini untuk lebih jelasnya. Ada versi fatpacked yang mudah digunakan di git repo .
Tim Bunce

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
ini bekerja dengan baik bagi kita yang belum menginstal cpan.
pdwalker

Jawaban yang benar-benar diremehkan. Ini juga berfungsi untuk distribusi RHEL.
Cristina

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

Butuh waktu lebih lama untuk berlari dari yang saya harapkan (sekitar 20 detik atau lebih di mesin saya), tetapi bekerja dengan sempurna! Jawaban yang bagus.
Hans Goldman

19

Anda dapat mencoba ExtUtils-Installed , tetapi itu hanya terlihat di .packlists, jadi mungkin kehilangan modul yang orang-orang pindahkan ke dalamnya @INCdengan tangan.

Saya menulis App-Module-Lister untuk seorang teman yang ingin melakukan ini sebagai skrip CGI pada akun hosting web non-shell. Anda cukup mengambil file modul dan mengunggahnya sebagai nama file yang akan diperlakukan server Anda sebagai skrip CGI. Itu tidak memiliki ketergantungan di luar Perpustakaan Standar. Gunakan sebagaimana adanya atau curi kodenya.

Ini mengeluarkan daftar modul dan versinya:

Tie :: Siklus 1.15
Seri :: IxHash 1.21
Tie :: Toggle 1.07
Tie :: ToObject 0.03
Waktu :: Ctime 99.062201
Waktu :: DaysInMonth 99.1117
Waktu :: Epoch 0.02
Waktu :: Fuzzy 0.34
Waktu :: JulianDay 2003,1125
Waktu :: ParseDate 2006.0814
Waktu :: Zona Waktu 2006.0814

Saya sudah lama ingin menambahkan ini sebagai fitur ke cpanalat, jadi saya akan melakukannya juga. [Waktu berlalu] Dan, sekarang saya memiliki -ltombol cpan. Saya memiliki beberapa hal lain yang harus dilakukan sebelum saya membuat rilis, tetapi ada di github . Jika Anda tidak ingin menunggu itu, Anda bisa mencoba -asakelar untuk membuat bundel otomatis, meskipun itu menempatkan beberapa Pod di sekitar daftar.

Semoga berhasil;


13

Berikut skrip yang akan melakukan trik:

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

Di bawah RHEL 6.9, skrip ini hanya mencetak berikut ini: Perl - 5.10.1 Modul tidak terdaftar.
Hans Deragon

9

Saya suka menggunakan perintah CPAN 'r' untuk ini. Anda bisa masuk ke shell CPAN dengan gaya lama:

sudo perl -MCPAN -e shell

atau, pada kebanyakan sistem yang lebih baru, terdapat perintah 'cpan', jadi perintah ini akan membawa Anda ke shell:

sudo cpan

(Anda biasanya harus menggunakan 'sudo' untuk menjalankannya sebagai root, atau menggunakan 'su -' untuk menjadi root sebelum Anda menjalankannya, kecuali jika Anda memiliki cpan yang diatur agar Anda dapat menjalankannya sebagai pengguna biasa, tetapi instal sebagai root. Jika Anda tidak memiliki root pada mesin ini, Anda masih dapat menggunakan shell CPAN untuk mengetahui informasi ini, tetapi Anda tidak akan dapat menginstal modul, dan Anda mungkin harus melalui sedikit pengaturan saat pertama kali Anda melakukannya. menjalankannya.)

Kemudian, setelah Anda berada di shell cpan, Anda dapat menggunakan perintah 'r' untuk melaporkan semua modul yang diinstal dan versinya. Jadi, pada prompt "cpan>", ketik 'r'. Ini akan mencantumkan semua modul yang diinstal dan versinya. Gunakan '?' untuk mendapatkan bantuan lebih lanjut.


1
sebenarnya 'r' memberi Anda rekomendasi instal ulang - yaitu semua modul di instalasi Anda yang memiliki versi CPAN yang lebih baru. Kecuali jika pemasangan Anda sudah sangat usang, ini tidak akan menjadi daftar lengkap.
EvdB

'R' saya selalu melaporkan hampir tidak ada karena saya meningkatkan secara kompulsif. Yang mengingatkan saya ... Saya belum meningkatkan hari ini.
skiphoppy

3
-R mengkompilasi ulang barang. Untuk mendapatkan daftar, coba -a atau unduh sumber terbaru dan mainkan dengan tombol -l baru, ditambahkan hanya untuk jawaban ini. :)
brian d foy

1
Kenapa sudodisini? Ini sama sekali tidak perlu.
Aristoteles Pagaltzis

2
perhatikan perbedaan antara argumen baris perintah '-r' dengan 'cpan', dan perintah 'r' di cpan shell :)
EvdB

7

Berikut adalah cara yang benar-benar hack untuk melakukannya di * nix, Anda akan mendapatkan beberapa hal yang tidak terlalu Anda pedulikan (yaitu: peringatan :: register dll), tetapi ini akan memberi Anda daftar setiap file .pm yang dapat diakses melalui perl.


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


2
Ini tidak akan memberikan apa yang dia inginkan. Itu tidak akan mengelompokkan file terkait berdasarkan distribusinya, dan itu akan mencantumkan semua file inti * .pm dari Perl itu sendiri.
rjray

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

Ini sangat bagus karena dengan jelas menunjukkan jalur lengkap ke setiap *.pmmodul. Anda mungkin melihat banyak duplikat ...
not2qubit

7

Anda bisa mendapatkan daftar modul perl yang diinstal di sistem Anda dengan menggunakan instmodshperintah di terminal Anda. Ini akan menanyakan tiga opsi untuk meningkatkan output yaitu:

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

6

Di Linux / Unix saya menggunakan perintah sederhana ini:

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

Ini memindai semua folder @INCdan mencari file * .pm.


Terima kasih! Sangat berguna.
not2qubit

Terima kasih! Itu mungkin perl paling banyak yang pernah saya ajarkan dengan ekspresi yang begitu ringkas.
ewd




2

Semua yang tidak dapat menginstal perldoc, atau modul lain, dan ingin tahu modul apa yang tersedia (CPAN atau lainnya), berikut ini berfungsi untuk linux dan Mingw32 / 64:

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

Ya, itu berantakan. Ya, itu mungkin melaporkan lebih dari yang Anda inginkan. Tetapi jika Anda menyalurkannya ke dalam file, Anda dapat dengan mudah memeriksa, katakanlah, antarmuka dbm mana yang ada:

 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;

Itulah mengapa saya berakhir di halaman ini (kecewa)

(Saya menyadari ini tidak menjawab pertanyaan OP dengan tepat, tetapi saya mempostingnya untuk siapa saja yang berakhir di sini karena alasan yang sama dengan saya. Itulah masalah tumpukan ***, hampir tidak mungkin menemukan pertanyaan Anda. bertanya, bahkan ketika itu ada, namun tumpukan *** hampir selalu menjadi hit teratas Google!)


Ini berhasil untuk saya. Terima kasih telah memposting ini. Saya membutuhkan ini di lingkungan di mana saya tidak memiliki banyak akses untuk menginstal / memperbarui dependensi apa pun.
Ashish Kumar

1

Saya menulis skrip perl kemarin untuk melakukan hal ini. Skrip mengembalikan daftar modul perl yang diinstal di @INC menggunakan '::' sebagai pemisah. Panggil skrip menggunakan -

perl perlmod.pl

ATAU

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

Sampai sekarang skrip melewatkan direktori saat ini ('.') Karena saya mengalami masalah dengan tautan lunak berulang tetapi Anda dapat memasukkannya dengan mengubah fungsi grep di baris 17 dari

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

hanya,

@INC

Scriptnya dapat ditemukan di sini.



1

Untuk berjalan melalui pohon direktori @INC tanpa menggunakan program eksternal seperti ls (1), seseorang dapat menggunakan File::Find::Rulemodul, yang memiliki antarmuka deklaratif yang bagus.

Juga, Anda ingin memfilter duplikat jika versi Perl sebelumnya berisi modul yang sama. Kode untuk melakukan ini terlihat seperti:

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

Di akhir proses, Anda juga memiliki semua nama modul Anda sebagai kunci di% seen hash. Kode tersebut dapat diadaptasi untuk menyimpan nama file kanonik (diberikan dalam $ file) sebagai nilai kunci alih-alih hitungan berapa kali terlihat.


1

Berikut ini berhasil untuk saya.

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

1

Berikut adalah skrip oleh @ JamesThomasMoon1979 yang ditulis ulang sebagai satu baris

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


0

Berikut adalah satu-liner Perl yang akan mencetak daftar modul yang diinstal:

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

Pastikan Anda memiliki Data :: Dumper diinstal.


2
Ini hanya mendaftar sekitar 15 modul perl, bukan 5945 daftar 'cpan -l'.
Paul Tomblin

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

Pengguna Windows cukup melakukan pencarian Windows Explorer untuk menemukannya.


0

Coba "perldoc -l":

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


-1

Saat Anda memasukkan skrip Perl, Anda memiliki semua modul yang diinstal sebagai file .pm di bawah folder di @INC sehingga skrip bash kecil akan melakukan pekerjaan untuk Anda:

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

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

-2

Untuk Linux, cara termudah untuk mendapatkannya adalah,

dpkg -l | grep "perl"

1
OP meminta daftar modul CPAN (perl) yang diinstal di sistem, bukan jika perl diinstal di sistem (OP juga tidak memberi tahu kami jika apt tersedia)
ROLO

Saya bukan ahli perl tetapi saya telah melihat modul perl yang diinstal dari perintah di atas. Mungkin bukan jawaban yang sempurna di sini.
Yasiru G

@YasiruG hanya mencantumkan yang telah diinstal melalui paket; itu minoritas dalam instalasi apa pun. Kebanyakan dari mereka diinstal melalui CPAN.
jjmerelo

-2

Ini berhasil untuk saya

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

Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan terbatas dan langsung. Sebuah penjelasan yang tepat akan sangat meningkatkan nilai jangka panjang dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat untuk pembaca masa depan dengan lainnya, pertanyaan-pertanyaan serupa. Mohon edit jawaban Anda untuk menambahkan penjelasan, termasuk asumsi yang Anda buat.
Machavity

-3

Inilah yang saya lakukan: perl -M{cpan_module}
Jika Anda tidak menerima kesalahan apa pun, ada kemungkinan besar modul tersebut diinstal.


2
Saya tidak percaya ini menjawab pertanyaan itu. Dengan menggunakan saran ini, seseorang membutuhkan waktu cukup lama untuk menelusuri modul demi modul untuk menemukan modul mana yang diinstal atau tidak.
Dave Newman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.