Apa cara termudah untuk memasang modul Perl yang hilang?


192

Saya mendapatkan kesalahan ini:

Can't locate Foo.pm in @INC

Apakah ada cara yang lebih mudah untuk menginstalnya daripada mengunduh, menghapus, membuat, dll?


1
Jika modul yang dimaksud adalah modul inti, bacalah Cara memperbaikinya "Tidak dapat menemukan Arsip / Tar.pm" .
ikegami

Berhati-hatilah dengan keamanan: apa yang diperlukan untuk memastikan bahwa modul-modul yang belum dimodifikasi harus diunduh dengan cara yang aman dari situs tepercaya. Lihat jawaban saya tentang penggunaan cpan.
vinc17

Jawaban:


226

Di Unix :

biasanya Anda memulai cpan di shell Anda:

# cpan

dan ketik

install Chocolate::Belgian

atau dalam bentuk singkat:

cpan Chocolate::Belgian

Di Windows :

Jika Anda menggunakan ActivePerl pada Windows, PPM (Perl Package Manager) memiliki banyak fungsi yang sama dengan CPAN.pm.

Contoh:

# ppm
ppm> search net-smtp
ppm> install Net-SMTP-Multipart

lihat Bagaimana cara menginstal modul Perl? di FAQ CPAN

Banyak distribusi mengirimkan banyak modul perl sebagai paket.

  • Debian / Ubuntu: apt-cache search 'perl$'
  • Arch Linux: pacman -Ss '^perl-'
  • Gentoo: kategori dev-perl

Anda harus selalu memilih mereka karena Anda mendapat manfaat dari pembaruan otomatis (keamanan) dan kemudahan penghapusan . Ini bisa sangat rumit dengan alat cpan itu sendiri.

Untuk Gentoo ada alat yang bagus bernama g-cpan yang membangun / menginstal modul dari CPAN dan membuat paket Gentoo ( ebuild ) untuk Anda.


14
Bentuk singkatnya hanya "cpan Chocolate :: Belgian" dari baris perintah :)
brian d foy

3
IIRC ActivePerl terbaru tidak lagi memiliki ppm baris perintah, sekarang membuka GUI mewah.
Kev

6
Hanya "ppm" membuka GUI, tetapi diikuti oleh perintah itu tetap di baris perintah. Jadi, "ppm help", "ppm install ...", dll.
Bill Ruppert

Perhatikan bahwa ppm menggunakan tanda hubung untuk pemisah jalur modul bukan titik dua ganda biasa. (Mungkin karena titik dua berarti drive dalam dos?) Itu membuat saya beberapa kali;)
Matthew Lock

3
@ MatthewLock: ppmmenggunakan tanda hubung -karena Anda menentukan distribusi yang ingin Anda instal, yang jauh lebih jujur. Misalnya, jika Anda menggunakan cpanuntuk menginstal LWP, LWP::Simpleatau LWP::UserAgentitu akan menginstal distribusi libwww-perluntuk Anda. Mayoritas distribusi berisi modul tunggal dengan nama yang setara, tetapi ada beberapa pengecualian seperti itu
Borodin

65

Coba Aplikasi :: cpanminus :

# cpanm Chocolate::Belgian

Ini bagus untuk menginstal barang. Ini tidak menyediakan fungsi CPAN atau CPANPLUS yang lebih kompleks, sehingga mudah digunakan, asalkan Anda tahu modul mana yang ingin Anda instal. Jika Anda belum memiliki cpanminus, cukup ketik:

# cpan App::cpanminus

untuk menginstalnya.

Dimungkinkan juga untuk menginstalnya tanpa menggunakan cpan sama sekali. Prosedur bootstrap dasar adalah,

curl -L http://cpanmin.us | perl - --sudo App::cpanminus

Untuk informasi lebih lanjut, buka halaman App :: cpanminus dan lihat bagian instalasi.


7
Menggunakan cpanuntuk menginstal App::cpanminusagak aneh. Instruksi instalasi normal melibatkan prosedur bootstrap untuk mengunduh sebagian dari itu dari cpanmin.us dan menggunakannya untuk menginstal sisanya. Ini menghindari konfigurasi cpandan pembuatan .cpandirektori tidak berguna (sesudahnya) .
Chas. Owens

Di Ubuntu, Anda cukup menginstal cpanminusdari terminal. Saya menemukan cpanmlebih baik daripada cpankarena itu tidak menempatkan log kesalahan di layar daripada menyimpannya dalam file log sementara dan memberikan jalan jika terjadi kesalahan.
user13107

Saya mendapatkan kesalahan ini ketika mencoba perintah Anda: Tidak dapat menemukan strict.pm di @INC (Anda mungkin perlu menginstal modul ketat) (@INC berisi: / etc / perl
IgorGanapolsky

29

Saya perhatikan beberapa orang menyarankan satu run cpan di bawah sudo. Dulu itu perlu untuk menginstal ke direktori sistem, tetapi versi modern dari shell CPAN memungkinkan Anda untuk mengonfigurasinya untuk menggunakan sudo hanya untuk menginstal. Ini jauh lebih aman, karena itu berarti tes tidak berjalan sebagai root.

Jika Anda memiliki shell CPAN lama, cukup instal cpan baru ("install CPAN") dan ketika Anda memuat shell, itu akan meminta Anda untuk mengkonfigurasi arahan baru ini.

Saat ini, ketika saya menggunakan sistem dengan CPAN lama, hal pertama yang saya lakukan adalah memperbarui shell dan mengaturnya untuk melakukan ini sehingga saya dapat melakukan sebagian besar pekerjaan cpan saya sebagai pengguna normal.

Juga, saya sangat menyarankan agar pengguna Windows menyelidiki strawberry Perl . Ini adalah versi Perl yang dikemas dengan shell CPAN yang sudah dikonfigurasi sebelumnya serta kompiler. Ini juga mencakup beberapa modul Perl yang sulit dikompilasi dengan dependensi pustaka C eksternal mereka, terutama XML :: Parser. Ini berarti Anda dapat melakukan hal yang sama seperti setiap pengguna Perl lainnya dalam hal menginstal modul, dan banyak hal cenderung "hanya bekerja" lebih sering.


1
install CPANdari mana? $sudo apt-get install cpan?
isomorphismes

1
@Lao Tzu: tidak, karena CPAN adalah modul inti Perl dan tidak tersedia sebagai paket DEB terpisah. Saya pikir dalam sebagian besar situasi bahkan lebih baik untuk digunakan App::cpanminus, itu adalah sukacita untuk menggunakannya. Philip Potter menyarankannya dalam jawabannya di sini dan Anda dapat mencoba Chas ini. Owens menjawab .
minggu

25

Jika Anda menggunakan Ubuntu dan Anda ingin menginstal modul perl pra-paket (misalnya, geo :: ipfree) coba ini:

    $ apt-cache search perl geo :: ipfree
    libgeo-ipfree-perl - Sebuah negara yang mencari modul Perl alamat ip

    $ sudo apt-get install libgeo-ipfree-perl

Ini bagus. Terima kasih.
Ivan X

16

Beberapa orang menyebutkan utilitas cpan, tetapi lebih dari sekadar memulai sebuah shell. Berikan saja modul yang ingin Anda instal dan biarkan berfungsi.

$prompt> cpan Foo::Bar

Jika Anda tidak memberikan argumen apa pun, ia akan memulai shell CPAN.pm. Ini berfungsi pada Unix, Mac, dan seharusnya baik-baik saja di Windows (terutama Strawberry Perl).

Ada beberapa hal lain yang dapat Anda lakukan dengan alat cpan juga. Berikut ringkasan dari fitur saat ini (yang mungkin lebih baru dari yang ada pada CPAN.pm dan perl):

-a
Creates the CPAN.pm autobundle with CPAN::Shell->autobundle.

-A module [ module ... ]
Shows the primary maintainers for the specified modules

-C module [ module ... ]
Show the Changes files for the specified modules

-D module [ module ... ]
Show the module details. This prints one line for each out-of-date module (meaning,
modules locally installed but have newer versions on CPAN). Each line has three columns:
module name, local version, and CPAN version.

-L author [ author ... ]
List the modules by the specified authors.

-h
Prints a help message.

-O
Show the out-of-date modules.

-r
Recompiles dynamically loaded modules with CPAN::Shell->recompile.

-v
Print the script version and CPAN.pm version.

11

sudo perl -MCPAN -e 'install Foo'


Brilliant, ini bekerja untuk saya sekarang di Windows dengan Git perl, tapi saya harus menginstal GnuWin make first
wytten


8

Otto membuat saran yang bagus . Ini bekerja untuk Debian juga, serta turunan Debian lainnya. Bagian yang hilang adalah apa yang harus dilakukan ketika pencarian apt-cache tidak menemukan sesuatu.

$ sudo apt-get install dh-make-perl build-essential apt-file
$ sudo apt-file update

Maka setiap kali Anda memiliki modul acak yang ingin Anda instal:

$ cd ~/some/path
$ dh-make-perl --build --cpan Some::Random::Module
$ sudo dpkg -i libsome-random-module-perl-0.01-1_i386.deb

Ini akan memberi Anda paket deb yang dapat Anda instal untuk mendapatkan Some :: Random :: Module. Salah satu manfaat besar di sini adalah halaman manual dan skrip sampel selain modul itu sendiri akan ditempatkan di lokasi pilihan distro Anda. Jika distro pernah keluar dengan paket resmi untuk versi Some :: Random :: Module yang lebih baru, itu akan diinstal secara otomatis ketika Anda ingin mendapatkan peningkatan.


7

Sudah dijawab dan diterima jawaban - tetapi tetap:

IMHO cara termudah memasang modul CPAN (pada sistem seperti unix, dan tidak tahu tentang keajaiban) adalah:

curl -L http://cpanmin.us | perl - --sudo App::cpanminus

Di atas adalah menginstal "installer nol modul konfigurasi CPAN" yang disebut cpanm. (Butuh beberapa menit untuk menginstal - jangan hancurkan prosesnya)

dan setelah - cukup:

cpanm Foo
cpanm Module::One
cpanm Another::Module

6

Banyak rekomendasi untuk CPAN.pm, yang sangat bagus, tetapi jika Anda menggunakan Perl 5.10maka Anda juga punya akses CPANPLUS.pmyang CPAN.pmlebih baik.

Dan, tentu saja, ini tersedia CPANuntuk orang yang masih menggunakan versi Perl yang lebih lama. Kenapa tidak mencoba:

$ cpan CPANPLUS

Heh, itu lucu. Gunakan CPAN.pm untuk mengganti sendiri dengan CPANPLUS. :)
brian d foy

5

Sering kali itu terjadi bahwa perintah install cpan gagal dengan pesan seperti "make test telah mengembalikan status buruk, tidak akan menginstal tanpa paksa"

Dalam hal ini, berikut adalah cara untuk menginstal modul:

perl -MCPAN -e "CPAN::Shell->force(qw(install Foo::Bar));"

Sayangnya hasil ini: Tidak dapat menemukan CPAN.pm di @INC (Anda mungkin perlu menginstal modul CPAN) (@INC berisi: / etc / perl
IgorGanapolsky

4

Di ubuntu, sebagian besar modul perl sudah dipaket, jadi pemasangannya jauh lebih cepat daripada kebanyakan sistem lain yang harus dikompilasi.

Untuk menginstal Foo::Bardi prompt perintah misalnya biasanya Anda hanya perlu:

sudo apt-get install libfoo-bar-perl

Sayangnya tidak semua modul mengikuti konvensi penamaan itu.



4

Gunakan perintah cpan sebagai cpan Modulename

$ cpan HTML::Parser

Untuk menginstal dependensi secara otomatis ikuti yang berikut ini

$ perl -MCPAN -e shell
cpan[1]>  o conf prerequisites_policy follow
cpan[2]>  o conf commit
exit

Saya lebih suka App :: cpanminus , ia menginstal dependensi secara otomatis. Kerjakan saja

$ cpanm HTML::Parser

3

2 cara yang saya tahu:

MENGGUNAKAN PPM:

Dengan Windows (ActivePerl) saya telah menggunakan ppm

dari baris perintah ketik ppm. Pada prompt ppm ...

ppm> install foo

atau

ppm> search foo

untuk mendapatkan daftar modul foo yang tersedia. Ketik bantuan untuk semua perintah

MENGGUNAKAN CPAN:

Anda juga dapat menggunakan CPAN seperti ini ( * sistem nix ):

perl -MCPAN -e 'shell'

memberi Anda prompt

cpan>

pada prompt ...

cpan> install foo  (again to install the foo module)

ketik h untuk mendapatkan daftar perintah untuk cpan


1
Anda juga bisa mengatakan "$ cpan Foo :: Bar" untuk menginstal langsung dari baris perintah. Tidak diperlukan satu liner atau shell CPAN yang mewah. :)
brian d foy

3

Di Fedora Anda dapat menggunakan

# yum install foo

selama Fedora memiliki paket yang ada untuk modul.


3

Pada Fedora Linuxatau Enterprise Linux, yumjuga melacak dependensi perl library. Jadi, jika modul perl tersedia, dan beberapa paket rpm mengekspor ketergantungan itu, ia akan menginstal paket yang tepat untuk Anda.

yum install 'perl(Chocolate::Belgian)'

(kemungkinan besar paket perl-Chocolate-Belgia, atau bahkan paket ChocolateFactory)


3

Cara termudah bagi saya adalah ini:

PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install DateTime::TimeZone'

a) deteksi / penyelesaian / pemasangan dependensi rekursif otomatis

b) ini shell onliner, bagus untuk setup-skrip


2

Jika Anda ingin meletakkan modul baru ke lokasi kustom yang shell cpan Anda tidak dikonfigurasi untuk digunakan, maka mungkin, yang berikut ini akan berguna.

 #wget <URL to the module.tgz>
 ##unpack
 perl Build.PL
./Build destdir=$HOME install_base=$HOME
./Build destdir=$HOME install_base=$HOME install

2

Kadang-kadang Anda dapat menggunakan yum search foountuk mencari modul perl relatif, lalu gunakan yum install xxxuntuk menginstal.


2

Solusi aman

Banyak jawaban menyebutkan penggunaan cpanutilitas (yang menggunakan CPAN.pm) tanpa kata keamanan. Secara default, CPAN2.27 dan sebelumnya mengonfigurasi urllistuntuk menggunakan URL http (yaitu, http://www.cpan.org/ ), yang memungkinkan serangan MITM, dengan demikian tidak aman. Ini adalah apa yang digunakan untuk mengunduh CHECKSUMSfile, sehingga perlu diubah ke URL yang aman (mis. Https://www.cpan.org/ ).

Jadi, setelah menjalankan cpan dan menerima konfigurasi default, Anda perlu memodifikasi MyConfig.pmfile yang dihasilkan (path lengkap adalah output) dengan cara berikut. Menggantikan

'urllist' => [q[http://www.cpan.org/]],

oleh

'urllist' => [q[https://www.cpan.org/]],

Catatan: https tidak cukup; Anda juga membutuhkan situs web yang bisa Anda percayai. Jadi, berhati-hatilah jika Anda ingin memilih cermin sewenang-wenang.

Maka Anda bisa menggunakannya cpandengan cara biasa.

Laporan bug saya di rt.cpan.org tentang URL tidak aman.


Apakah " cpan.org " tidak dialihkan ke " cpan.org "?
Dave Everitt

1
@DaveEveritt Pengalihan dari http ke https hanya berguna untuk privasi, misalnya terhadap seseorang yang hanya dapat melihat data yang transit di jaringan. Tetapi jika seorang penyerang mengontrol jaringan (misalnya hotspot wifi publik atau beberapa jaringan lokal yang tidak terlindungi), serangan man-in-the-middle mungkin dilakukan, dan penyerang akan menggunakan servernya sendiri (jelas tidak https://www.cpan.org/).
vinc17

1

Di Windows dengan distribusi ActiveState Perl, gunakan perintah ppm .



1

Sepertinya Anda sudah mendapatkan jawaban Anda, tetapi saya pikir saya akan berpadu. Inilah yang saya lakukan di beberapa skrip di Ubuntu (atau server debian)

#!/usr/bin/perl

use warnings;
use strict;

#I've gotten into the habit of setting this on all my scripts, prevents weird path issues if the script is not being run by root
$ENV{'PATH'} = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin';

#Fill this with the perl modules required for your project
my @perl = qw(LWP::Simple XML::LibXML MIME::Lite DBI DateTime Config::Tiny Proc::ProcessTable);

chomp(my $curl = `which curl`);

if(!$curl){ system('apt-get install curl -y > /dev/null'); }

chomp(my $cpanm = system('/bin/bash', '-c', 'which cpanm &>/dev/null'));

#installs cpanm if missing
if($cpanm){ system('curl -s -L http://cpanmin.us | perl - --sudo App::cpanminus'); }

#loops through required modules and installs them if missing
foreach my $x (@perl){
    eval "use $x";
    if($@){
        system("cpanm $x");
        eval "use $x";
    }
}

Ini berfungsi baik untuk saya, mungkin ada sesuatu di sini yang dapat Anda gunakan.

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.