Qual è il modo più semplice per installare un modulo Perl mancante?


192

Ottengo questo errore:

Can't locate Foo.pm in @INC

Esiste un modo più semplice per installarlo che scaricare, decomprimere, creare, ecc.?


1
Se il modulo in questione è un modulo principale, consultare Come risolvere "Impossibile trovare Archive / Tar.pm" .
ikegami,

Prestare molta attenzione alla sicurezza: ciò che è necessario per garantire che i moduli non siano stati modificati deve essere scaricato in modo sicuro da un sito attendibile. Vedi la mia risposta sull'uso di cpan.
vinc17,

Risposte:


226

Su Unix :

di solito si avvia cpan nella shell:

# cpan

e digitare

install Chocolate::Belgian

o in forma abbreviata:

cpan Chocolate::Belgian

Su Windows :

Se si utilizza ActivePerl su Windows, il PPM (Perl Package Manager) ha molte delle stesse funzionalità di CPAN.pm.

Esempio:

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

vedere Come installo i moduli Perl? nelle FAQ CPAN

Molte distribuzioni spediscono molti pacchetti perl come pacchetti.

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

Dovresti sempre preferirli poiché beneficerai degli aggiornamenti automatici (di sicurezza) e della facilità di rimozione . Questo può essere piuttosto complicato con lo strumento cpan stesso.

Per Gentoo c'è un simpatico strumento chiamato g-cpan che costruisce / installa il modulo da CPAN e crea un pacchetto Gentoo ( ebuild ) per te.


14
La forma abbreviata è semplicemente "cpan Chocolate :: Belgian" dalla riga di comando :)
brian d foy,

3
IIRC l'ultimo ActivePerl non ha più la riga di comando ppm, ora apre un'interfaccia grafica di fantasia.
Kev,

6
Solo "ppm" apre la GUI, ma seguita da comandi rimane nella riga di comando. Quindi, "ppm help", "ppm install ...", ecc.
Bill Ruppert,

Si noti che ppm utilizza trattini per il separatore del percorso del modulo non i soliti doppi punti. (Forse perché i due punti significano pulsioni nei dos?) Questo mi ha fatto venire un paio di volte;)
Matthew Lock,

3
@MatthewLock: ppmusa trattini -perché specifichi la distribuzione che vuoi installare, che è molto più onesta. Ad esempio, se si utilizza cpanper l'installazioneLWP , LWP::Simpleo LWP::UserAgentinstallerà la distribuzione libwww-perlper te. La maggior parte delle distribuzioni contiene un singolo modulo con un nome equivalente, ma ci sono diverse eccezioni come questa
Borodin

65

Prova l' app :: cpanminus :

# cpanm Chocolate::Belgian

È ottimo solo per installare le cose. Non fornisce nessuna delle funzionalità più complesse di CPAN o CPANPLUS, quindi è facile da usare, a patto che tu sappia quale modulo vuoi installare. Se non hai già cpanminus, digita:

# cpan App::cpanminus

per installarlo.

È anche possibile installarlo senza usare cpan. La procedura di bootstrap di base è,

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

Per maggiori informazioni vai alla pagina App :: cpanminus e guarda la sezione sull'installazione.


7
L'uso cpanper installare App::cpanminusè un po 'strano. Le normali istruzioni di installazione prevedono una procedura di bootstrap per scaricare una parte di esso da cpanmin.us e utilizzarla per installare il resto. Ciò evita la configurazione cpane la creazione di una .cpandirectory (di seguito) inutile .
Chas. Owens,

Su Ubuntu, puoi semplicemente installare cpanminusdal terminale. Trovo cpanmmigliore che cpanperché non mette i log degli errori sullo schermo, piuttosto li memorizza in file di log temporanei e fornisce il percorso in caso di errori.
user13107

Ricevo questo errore quando provo il
IgorGanapolsky

29

Noto alcune persone che suggeriscono una corsa in cpan sotto sudo. In passato era necessario installarlo nella directory di sistema, ma le versioni moderne della shell CPAN consentono di configurarlo per usare solo sudo per l'installazione. Questo è molto più sicuro, poiché significa che i test non vengono eseguiti come root.

Se hai una vecchia shell CPAN, installa semplicemente il nuovo cpan ("installa CPAN") e quando ricarichi la shell, dovrebbe chiederti di configurare queste nuove direttive.

Al giorno d'oggi, quando sono su un sistema con un vecchio CPAN, la prima cosa che faccio è aggiornare la shell e configurarla per farlo in modo da poter fare la maggior parte del mio lavoro di cpan come un normale utente.

Inoltre, suggerirei vivamente agli utenti di Windows di esaminare il Perl alla fragola . Questa è una versione di Perl fornita con una shell CPAN preconfigurata e un compilatore. Include anche alcuni moduli Perl difficili da compilare con le loro dipendenze dalla libreria C esterna, in particolare XML :: Parser. Ciò significa che puoi fare la stessa cosa di ogni altro utente Perl quando si tratta di installare moduli, e le cose tendono a "funzionare" molto più spesso.


1
install CPANda dove? $sudo apt-get install cpan?
isomorfismi

1
@Lao Tzu: no, poiché CPAN è il modulo core Perl e non è disponibile come pacchetto DEB separato. Penso che nella maggior parte delle situazioni sia ancora meglio usare App::cpanminus, è una tale gioia usarlo. Philip Potter lo suggerisce nella sua risposta qui e potresti provare questo Chas. Owens risponde .
settimana

25

Se sei su Ubuntu e vuoi installare il modulo perl preconfezionato (ad esempio geo :: ipfree) prova questo:

    $ apt-cache search perl geo :: ipfree
    libgeo-ipfree-perl - Un paese di ricerca dell'indirizzo IP modulo Perl

    $ sudo apt-get install libgeo-ipfree-perl

Questo è fantastico Grazie.
Ivan X il

16

Un paio di persone hanno menzionato l'utilità cpan, ma è molto più che avviare una shell. Dagli semplicemente i moduli che vuoi installare e lascia che funzioni.

$prompt> cpan Foo::Bar

Se non gli dai argomenti, avvia la shell CPAN.pm. Funziona su Unix, Mac e dovrebbe andare bene su Windows (specialmente Strawberry Perl).

Ci sono molte altre cose che puoi fare anche con lo strumento cpan. Ecco un riepilogo delle funzionalità correnti (che potrebbero essere più recenti di quelle fornite con CPAN.pm e 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'


Fantastico, questo ha funzionato per me proprio ora su Windows con Git perl, ma ho dovuto installare GnuWin per primo
wytten


8

Otto ha dato un buon suggerimento . Questo funziona anche per Debian, così come per qualsiasi altro derivato Debian. Il pezzo mancante è cosa fare quando la ricerca di apt-cache non trova qualcosa.

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

Quindi ogni volta che hai un modulo casuale che desideri installare:

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

Questo ti darà un pacchetto deb che puoi installare per ottenere Some :: Random :: Module. Uno dei grandi vantaggi qui sono le pagine man e gli script di esempio in aggiunta al modulo stesso saranno collocati nella posizione scelta dalla tua distribuzione. Se la distro esce mai con un pacchetto ufficiale per una versione più recente di Some :: Random :: Module, verrà automaticamente installata quando apt-get upgrade.


7

Risposta già accettata e risposta accettata, ma comunque:

IMHO il modo più semplice per installare i moduli CPAN (su sistemi come unix e non avere idea delle meraviglie) è:

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

Quanto sopra sta installando il "programma di installazione dei moduli CPAN a configurazione zero" chiamato cpanm. (L'installazione può richiedere alcuni minuti - non interrompere il processo)

e dopo - semplicemente:

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

6

Un sacco di consigli per CPAN.pm, il che è fantastico, ma se lo stai usando Perl 5.10hai anche accesso a ciò CPANPLUS.pmche è come CPAN.pmma migliore.

E, naturalmente, è disponibile CPANper le persone che utilizzano ancora versioni precedenti di Perl. Perché non provare:

$ cpan CPANPLUS

Heh, è ​​carino. Utilizzare CPAN.pm per sostituirsi con CPANPLUS. :)
brian d foy,

5

Molte volte capita che il comando di installazione cpan fallisca con il messaggio "make test aveva restituito uno stato errato, non si installa senza forzare"

In tal caso, di seguito è riportato il modo di installare il modulo:

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

Sfortunatamente questo produce: Impossibile individuare CPAN.pm in @INC (potrebbe essere necessario installare il modulo CPAN) (@INC contiene: / etc / perl
IgorGanapolsky

4

Su Ubuntu la maggior parte dei moduli perl sono già impacchettati, quindi l'installazione è molto più veloce della maggior parte degli altri sistemi che devono essere compilati.

Per installare Foo::Barad un prompt dei comandi, ad esempio, di solito basta:

sudo apt-get install libfoo-bar-perl

Purtroppo non tutti i moduli seguono questa convenzione di denominazione.


4

Anche dovrebbe funzionare:

cpan -i module_name

4

Usa il comando cpan come cpan Modulename

$ cpan HTML::Parser

Per installare le dipendenze, seguire automaticamente le istruzioni seguenti

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

Preferisco App :: cpanminus , installa automaticamente le dipendenze. Basta fare

$ cpanm HTML::Parser

3

2 modi che conosco:

USANDO PPM:

Con Windows (ActivePerl) ho usato ppm

dalla riga di comando digitare ppm. Alla richiesta ppm ...

ppm> install foo

o

ppm> search foo

per ottenere un elenco di moduli foo disponibili. Digitare help per tutti i comandi

UTILIZZANDO CPAN:

puoi anche usare CPAN in questo modo ( * sistemi nix ):

perl -MCPAN -e 'shell'

ti dà un prompt

cpan>

al prompt ...

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

digitare h per ottenere un elenco di comandi per cpan


1
Puoi anche semplicemente dire "$ cpan Foo :: Bar" per installare direttamente dalla riga di comando. Non è necessario un solo rivestimento o guscio CPAN. :)
brian d foy,

3

Su Fedora puoi usare

# yum install foo

purché Fedora abbia un pacchetto esistente per il modulo.


3

Su Fedora Linuxo Enterprise Linux, yumtiene traccia anche delle dipendenze della libreria perl. Quindi, se il modulo perl è disponibile e alcuni pacchetti rpm esportano quella dipendenza, installerà il pacchetto giusto per te.

yum install 'perl(Chocolate::Belgian)'

(molto probabilmente il pacchetto perl-Chocolate-Belgian, o anche il pacchetto ChocolateFactory)


3

Il modo più semplice per me è questo:

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

a) rilevazione / risoluzione / installazione automatiche della dipendenza ricorsiva

b) è una shell onliner, ottima per gli script di installazione


2

Se vuoi mettere il nuovo modulo in una posizione personalizzata che la tua shell cpan non è configurata per usare, allora forse sarà utile quanto segue.

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

2

A volte è possibile utilizzare il yum search fooper cercare il relativo modulo perl, quindi utilizzare yum install xxxper installare.


2

Soluzione sicura

Molte risposte menzionano l'uso cpandell'utilità (che utilizza CPAN.pm) senza una parola sulla sicurezza. Per impostazione predefinita, la versione CPAN2.27 e precedenti configura urllistl'uso di un URL http (vale a dire, http://www.cpan.org/ ), che consente gli attacchi MITM, quindi non è sicuro. Questo è ciò che viene utilizzato per scaricare i CHECKSUMSfile, quindi è necessario modificarlo in un URL sicuro (ad es. Https://www.cpan.org/ ).

Quindi, dopo aver eseguito cpan e aver accettato la configurazione predefinita, è necessario modificare il MyConfig.pmfile generato (viene visualizzato il percorso completo) nel modo seguente. Sostituire

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

di

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

Nota: https non è sufficiente; hai anche bisogno di un sito web di cui ti puoi fidare. Quindi, fai attenzione se vuoi scegliere un mirror arbitrario.

Quindi puoi usarlo cpannel solito modo.

Il mio bug segnala su rt.cpan.org sull'URL non sicuro.


" Cpan.org " non viene reindirizzato a " cpan.org "?
Dave Everitt,

1
@DaveEveritt Il reindirizzamento da http a https è utile solo per la privacy, ad esempio contro qualcuno che può solo guardare i dati che transitano sulla rete. Ma se un utente malintenzionato controlla la rete (ad esempio un hotspot wifi pubblico o una rete locale non protetta), potrebbe essere possibile un attacco man-in-the-middle e l'attaccante utilizzerà il proprio server (ovviamente no https://www.cpan.org/).
vinc17,

1

Su Windows con la distribuzione ActiveState di Perl, utilizzare il comando ppm .



1

Sembra che tu abbia già ricevuto la tua risposta, ma ho pensato di entrare. Questo è quello che faccio in alcuni script su Ubuntu (o 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";
    }
}

Questo funziona bene per me, forse c'è qualcosa qui che puoi usare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.