Làm cách nào để nhận danh sách các mô-đun CPAN đã cài đặt?


88

Ngoài việc cố gắng

perldoc <module name>

riêng cho bất kỳ mô-đun CPAN nào mà tôi yêu thích hoặc đi qua hệ thống tệp và xem các thư mục, tôi không biết chúng tôi đã cài đặt những mô-đun nào.

Cách dễ nhất để chỉ có một danh sách lớn mọi mô-đun CPAN đã được cài đặt là gì? Từ dòng lệnh hoặc cách khác.


Tôi có thể đề xuất sử dụng pmtools , đặc biệt là pminst chấp nhận biểu thức chính quy.
lukmdo

perl-pmtools là công cụ tốt cho bạn.
jaseywang

Bạn có muốn biết những mô-đun nào được cài đặt, hoặc những bản phân phối nào được cài đặt không?
Tim Bunce

4
Tôi thấy cpan -lcó ích cho bản thân trên windows.
void

1
Điều này có thể hữu ích:instmodsh
Ravi

Câu trả lời:


65

Điều này được trả lời trong Câu hỏi thường gặp về Perl, câu trả lời có thể được tìm thấy nhanh chóng với perldoc -q installed. Trong ngắn hạn, nó liên quan đến việc sử dụng ExtUtils::Installedhoặc sử dụng File::Find, các biến thể của cả hai đều đã được đề cập trước đó trong chủ đề này.

Bạn cũng có thể tìm thấy mục Câu hỏi thường gặp "Làm cách nào để tìm mô-đun nào được cài đặt trên hệ thống của tôi?" trong perlfaq3. Bạn có thể xem danh sách tất cả các câu trả lời Câu hỏi thường gặp bằng cách xem trong perlfaq


36
Điều này mang lại nhiều hơn những gì OP yêu cầu mà nó hầu như vô dụng.
Justin

2
cpan -l đang thực hiện tìm kiếm đệ quy bất kỳ thư mục nào mà tôi chạy nó từ đó. Có cách nào để vượt qua ExtUtils::Installedcủa constructor skip_cwdtùy chọn từ dòng lệnh?
Mark Reed vào

10
Câu hỏi thường gặp cho biết sử dụng cpan -lnhưng điều đó không hoạt động trên RHEL6 và /usr/bin/cpan -llỗi Unknown option: l.
Stefan Lasiewski

1
$ perldoc perllocal | mô-đun grep $ perldoc perllocal | grep -E 'VERSION | Module'
caot

sử dụng perldoc -t perllocal để có được đầu ra văn bản đơn giản, nếu không grep có thể không làm việc do nhân vật ctrl nhúng
user333869

35
perldoc perllocal

Chỉnh sửa: Có thêm (một chút) thông tin về nó trong Câu hỏi thường gặp về CPAN


2
Cảm ơn vì liên kết đến Câu hỏi thường gặp. Thật không may, không phải tất cả các mô-đun tôi biết đã được cài đặt đều trở lại. Ngày :: Calc thậm chí không xuất hiện ở đó.
David McLaughlin

26

perldoc -q installed

tuyên bố điều đó cpan -lsẽ thực hiện thủ thuật, tuy nhiên nó không hiệu quả với tôi. Các tùy chọn khác:

cpan -a

không tạo ra một danh sách đẹp các gói đã cài đặt và có tác dụng phụ tốt là ghi chúng vào một tệp.


2
Đối với bản ghi, cpan -lhoạt động (hoặc với tôi với CPAN v2.05). cpan -athực sự là đẹp hơn.
William Turrell

23

Cần lưu ý rằng perldoc perllocal sẽ chỉ báo cáo về các mô-đun được cài đặt qua CPAN. Nếu ai đó cài đặt các mô-đun theo cách thủ công, nó sẽ không tìm thấy chúng. Ngoài ra, nếu bạn có nhiều người cài đặt mô-đun và perllocal.pod được kiểm soát nguồn, mọi người có thể giải quyết xung đột không chính xác và làm hỏng danh sách (ví dụ: điều này đã xảy ra ở đây tại nơi làm việc).

Rất tiếc, giải pháp dường như đang đi qua @INC với File :: Find hoặc thứ gì đó tương tự. Tuy nhiên, điều đó không chỉ tìm thấy các mô-đun, nó còn tìm thấy các mô-đun liên quan trong một bản phân phối. Ví dụ: nó sẽ báo cáo TAP :: Harness và TAP :: Parser ngoài tên phân phối thực tế của Test :: Harness (giả sử bạn có phiên bản 3 trở lên). Bạn có thể đối sánh chúng với tên phân phối và loại bỏ những tên không khớp, nhưng sau đó bạn có thể loại bỏ các mô-đun được xây dựng và cài đặt cục bộ.

Tôi tin rằng công việc lập chỉ mục backpan của brian d foy được cho là có mã để chuyển nó ở tệp .pm và nó sẽ cố gắng suy ra phân phối, nhưng thậm chí điều này đôi khi không thành công vì những gì trong một gói không nhất thiết phải được cài đặt (xem Devel :: Cover :: Inc làm ví dụ).


1
Tôi không nghĩ rằng tôi cần phải rút súng trong danh mục BackPAN cho cái đó. Một cái gì đó giống như tôi làm với Test :: Prereq để thu gọn nó bằng những gì nó tìm thấy trong 02 gói có thể là đủ. Đó là một chút khó khăn hơn là chỉ liệt kê các tệp mô-đun và danh mục vẫn chưa xử lý được điều đó.
brian d foy 22/09/08

2
Từ một thử nghiệm thô sơ (thực hiện "cài đặt make -n" trong một số dirs mà tôi đã đặt xung quanh), bước "thực hiện cài đặt" của bất kỳ mô-đun dựa trên MakeMaker nào sẽ cập nhật perllocal. Nó không dành riêng cho việc cài đặt trực tiếp qua CPAN.
rjray 22/09/08

1
Tôi nghĩ Dist :: Surveyor vẫn là công cụ tốt nhất để trả lời câu hỏi "những bản phân phối nào được cài đặt trong thư viện đó?". Xem bản trình bày này để biết thêm chi tiết. Có một phiên bản đóng gói béo dễ sử dụng trong 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
điều này hoạt động tốt cho những người trong chúng tôi, những người không cài đặt cpan.
pdwalker

Câu trả lời thực sự bị đánh giá thấp. Điều này cũng hoạt động đối với các bản phân phối RHEL.
Cristina

4
Tôi nhận được:No documentation found for "perllocal".
Luis A. Florit,

Mất nhiều thời gian để chạy hơn tôi mong đợi (khoảng 20 giây hoặc lâu hơn trên máy của tôi), nhưng nó hoạt động hoàn hảo! Câu trả lời chính xác.
Hans Goldman

19

Bạn có thể thử ExtUtils-Installed , nhưng điều đó chỉ xem trong .packlists, vì vậy nó có thể bỏ sót các mô-đun mà mọi người đã chuyển mọi thứ vào @INCbằng tay.

Tôi đã viết App-Module-Lister cho một người bạn muốn làm điều này dưới dạng tập lệnh CGI trên tài khoản lưu trữ web không shell. Bạn chỉ cần lấy tệp mô-đun và tải nó lên dưới dạng tên tệp mà máy chủ của bạn sẽ coi như một tập lệnh CGI. Nó không có phụ thuộc bên ngoài Thư viện Chuẩn. Sử dụng nó như cũ hoặc ăn cắp mã.

Nó xuất ra danh sách các mô-đun và các phiên bản của chúng:

Tie :: Chu kỳ 1.15
Tie :: IxHash 1.21
Tie :: Toggle 1.07
Tie :: ToObject 0.03
Thời gian :: CTime 99.062201
Thời gian :: DaysInMonth 99.1117
Thời gian :: Kỷ nguyên 0,02
Thời gian :: Mờ 0,34
Thời gian :: JulianDay 2003.1125
Thời gian :: ParseDate 2006.0814
Thời gian :: Múi giờ 2006.0814

Tôi đã có ý định thêm điều này như một tính năng vào cpancông cụ, vì vậy tôi cũng sẽ làm điều đó. [Thời gian trôi qua] Và, bây giờ tôi có một -lcông tắc trong cpan. Tôi có một số việc khác phải làm với nó trước khi phát hành, nhưng nó nằm trong github . Nếu bạn không muốn chờ đợi điều đó, bạn có thể thử -achuyển đổi để tạo một nhóm tự động, mặc dù điều đó đặt một số Pod xung quanh danh sách.

Chúc may mắn;


12

Đây là một tập lệnh sẽ thực hiện thủ thuật:

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

Trong RHEL 6.9, tập lệnh này chỉ in những nội dung sau: Perl - 5.10.1 Mô-đun không được liệt kê.
Hans Deragon

9

Tôi thích sử dụng lệnh CPAN 'r' cho việc này. Bạn có thể vào shell CPAN với kiểu cũ:

sudo perl -MCPAN -e shell

hoặc, trên hầu hết các hệ thống mới hơn, có lệnh 'cpan', vì vậy lệnh này sẽ đưa bạn đến trình bao:

sudo cpan

(Bạn thường phải sử dụng 'sudo' để chạy nó dưới dạng root hoặc sử dụng 'su -' để trở thành root trước khi bạn chạy nó, trừ khi bạn đã thiết lập cpan để cho phép bạn chạy nó như một người dùng bình thường, nhưng cài đặt dưới dạng root. Nếu bạn chưa root trên máy này, bạn vẫn có thể sử dụng shell CPAN để tìm hiểu thông tin này, nhưng bạn sẽ không thể cài đặt các mô-đun và bạn có thể phải thực hiện một chút thiết lập trong lần đầu tiên. chạy nó.)

Sau đó, khi bạn đang ở trong trình bao cpan, bạn có thể sử dụng lệnh 'r' để báo cáo tất cả các mô-đun đã cài đặt và phiên bản của chúng. Vì vậy, tại dấu nhắc "cpan>", hãy nhập 'r'. Điều này sẽ liệt kê tất cả các mô-đun đã cài đặt và các phiên bản của chúng. Sử dụng '?' để được trợ giúp thêm.


1
thực sự 'r' cung cấp cho bạn các đề xuất cài đặt lại - tức là tất cả các mô-đun trên cài đặt của bạn có phiên bản CPAN mới hơn. Trừ khi bản cài đặt của bạn đã quá cũ, đây sẽ không phải là danh sách đầy đủ.
EvdB 22/09/08

'R' của tôi luôn báo cáo bên cạnh không có gì bởi vì tôi bắt buộc nâng cấp. Điều đó nhắc tôi ... hôm nay tôi chưa nâng cấp.
jumphoppy 22/09/08

3
-R biên dịch lại nội dung. Để có danh sách, hãy thử -a hoặc tải xuống các nguồn mới nhất và chơi với công tắc -l mới, được thêm vào chỉ cho câu trả lời này. :)
brian d foy

1
Tại sao lại sudoở đây? Nó hoàn toàn không cần thiết.
Aristotle Pagaltzis 23/09/08

2
lưu ý sự khác biệt giữa đối số dòng lệnh '-r' đối với 'cpan' và lệnh 'r' trong trình bao cpan :)
EvdB

7

Đây là một cách thực sự khó thực hiện trong * nix, bạn sẽ nhận được một số thứ mà bạn không thực sự quan tâm (ví dụ: cảnh báo :: đăng ký, v.v.), nhưng nó sẽ cung cấp cho bạn danh sách mọi tệp .pm có thể truy cập qua perl.


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


2
Điều này sẽ không mang lại cho anh ta những gì anh ta muốn. Nó sẽ không nhóm các tệp liên quan theo cách phân phối mà chúng là một phần của nó, và nó sẽ liệt kê tất cả các tệp * .pm cốt lõi từ chính Perl.
rjray 22/09/08

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

Điều này rất tốt vì nó hiển thị rõ ràng đường dẫn đầy đủ đến từng *.pmmô-đun. Bạn có thể thấy nhiều bản sao ...
not2qubit

7

Bạn có thể nhận danh sách các mô-đun perl được cài đặt trong hệ thống của bạn bằng cách sử dụng instmodshlệnh trong thiết bị đầu cuối của bạn. Nó sẽ yêu cầu bạn ba tùy chọn để nâng cao đầu ra của chúng:

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

5

Trên Linux / Unix, tôi sử dụng lệnh đơn giản sau:

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

Nó quét tất cả thư mục trong @INCvà tìm kiếm bất kỳ tệp * .pm nào.


Cảm ơn bạn! Rất hữu dụng.
not2qubit

Cảm ơn bạn! Đó có lẽ là điều khó hiểu nhất mà tôi từng được dạy với cách diễn đạt cô đọng như vậy.
ewd




1

Tôi đã viết một kịch bản perl chỉ ngày hôm qua để làm chính xác điều này. Tập lệnh trả về danh sách các mô-đun perl được cài đặt trong @INC bằng cách sử dụng '::' làm dấu phân tách. Gọi tập lệnh bằng -

perl perlmod.pl

HOẶC LÀ

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

Hiện tại, tập lệnh sẽ bỏ qua thư mục hiện tại ('.') Vì tôi gặp sự cố với các liên kết mềm đệ quy nhưng bạn có thể bao gồm nó bằng cách thay đổi hàm grep trong dòng 17 từ

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

chỉ,

@INC

Kịch bản có thể được tìm thấy ở đây.



1

Để xem qua các cây thư mục @INC mà không cần sử dụng một chương trình bên ngoài như ls (1), người ta có thể sử dụng File::Find::Rulemô-đun có giao diện khai báo đẹp mắt.

Ngoài ra, bạn muốn lọc ra các bản sao trong trường hợp các phiên bản Perl trước đó chứa các mô-đun giống nhau. Mã để thực hiện việc này trông giống như:

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

Vào cuối quá trình chạy, bạn cũng có tất cả các tên mô-đun của mình dưới dạng các khóa trong băm% saw. Mã có thể được điều chỉnh để lưu tên tệp chuẩn (được cung cấp trong tệp $) làm giá trị của khóa thay vì số lần được nhìn thấy.


1

Những điều sau đây đã làm việc cho tôi.

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

1

Tất cả những người không thể cài đặt perldoc hoặc các mô-đun khác, và muốn biết những mô-đun nào có sẵn (CPAN hoặc cách khác), các cách sau hoạt động cho linux và Mingw32 / 64:

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

Vâng, nó lộn xộn. Có, nó có thể báo cáo nhiều hơn bạn muốn. Nhưng nếu bạn chuyển nó thành một tệp, bạn có thể dễ dàng kiểm tra, chẳng hạn như giao diện dbm nào hiện có:

 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;

Đó là lý do tại sao tôi kết thúc trên trang này (thất vọng)

(Tôi nhận ra rằng điều này không trả lời chính xác câu hỏi của OP, nhưng tôi đăng nó cho bất kỳ ai đã kết thúc ở đây vì lý do tương tự như tôi đã làm. Đó là vấn đề với ngăn xếp ***, gần như không thể tìm ra câu hỏi của bạn. yêu cầu, ngay cả khi nó tồn tại, nhưng ngăn xếp *** gần như luôn là hit hàng đầu của google!)


Điều này đã làm việc cho tôi. Cảm ơn vì đã đăng bài này. Tôi cần điều này trong một môi trường mà tôi không có nhiều quyền truy cập để cài đặt / cập nhật bất kỳ phụ thuộc nào.
Ashish Kumar


0

Đây là một lớp lót Perl sẽ in ra danh sách các mô-đun đã cài đặt:

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

Chỉ cần đảm bảo rằng bạn đã cài đặt Data :: Dumper.


2
Điều này chỉ liệt kê khoảng 15 mô-đun perl, thay vì 5945 mà 'cpan -l' liệt kê.
Paul Tomblin

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

Người dùng Windows chỉ cần thực hiện tìm kiếm Windows Explorer để tìm nó.


0

Hãy thử "perldoc -l":

$ perldoc -l Nhật ký :: Công văn /usr/local/share/perl/5.26.1/Log/Dispatch.pm


0

Đây là một kịch bản của @ JamesThomasMoon1979 được viết lại dưới dạng một lớp lót

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

-1

Khi bạn nhập tập lệnh Perl của mình, bạn có tất cả các mô-đun đã cài đặt dưới dạng tệp .pm bên dưới các thư mục trong @INC vì vậy một tập lệnh bash nhỏ sẽ thực hiện công việc cho bạn:

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

Tại sao không? find `perl -le'print for@INC'` -name '*.pm'
Hynek -Pichi- Vychodil

-2

Đối với Linux, cách dễ nhất để có được là,

dpkg -l | grep "perl"

1
OP hỏi cho một danh sách các CPAN (perl) module được cài đặt trong hệ thống, không nếu perl được cài đặt trong hệ thống (không phải OP nói với chúng tôi nếu apt có sẵn)
Rolo

Tôi không phải là chuyên gia về perl nhưng tôi đã thấy các mô-đun perl được cài đặt từ lệnh trên. Có thể không phải là câu trả lời hoàn hảo ở đây.
Yasiru G

-2

Điều này phù hợp với tôi

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

Cảm ơn bạn về đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp hạn chế, tức thì. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ khiến nó hữu ích hơn cho những người đọc trong tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm cả những giả định bạn đã đưa ra.
Machavity

-3

Đây là những gì tôi làm: perl -M{cpan_module}
Nếu bạn không nhận được bất kỳ lỗi nào thì rất có thể mô-đun đã được cài đặt.


2
Tôi không tin rằng điều này trả lời câu hỏi. Sử dụng gợi ý này, ai đó có thể mất một khoảng thời gian để xem qua từng mô-đun để khám phá mô-đun nào đã được cài đặt hay chưa.
Dave Newman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.