2015-03-12 11 views
7

Sto usando perlbrew. Ho installato molti moduli cpan sotto perlbrew perl-5.20.2.Spostamento/clonazione di un perlbrew installato perl più tutti i moduli cpan aggiuntivi

C'è un modo (o qual è il modo migliore) per fare un'installazione di tarball del mio perl-5.20.2 oltre a tutti i moduli CPAN che ho installato in perlbrew in modo che io possa semplicemente clonarlo su un'altra macchina?

Sono a conoscenza di perlbrew download perl-5.20.2 ma che sembra solo tarball perl-5.20.2 e non tutti i moduli CPAN che ho installato.

+2

Si potrebbe adottare l'approccio descritto in [Come reinstallare tutti i moduli su nuovo Perl] (http://perlbrew.pl/Reinstall-All-Modules-On-New-Perl.html), ma scrivere l'output di ' perlbrew list-modules' in un file, copia il file sull'altro computer e usalo come input per 'perlbrew exec'. Tuttavia, ciò richiederebbe il download dell'intero set di moduli due volte, e si otterrebbe l'ultima versione di tutto, quindi si potrebbero avere discrepanze di versione tra le due installazioni. – ThisSuitIsBlackNot

+1

@ThisSuitIsBlackNot ++ Con 'cpanm' puoi usare le versioni - come in' cpanm Plack @ 0.9990', ma non c'è alcuna opzione per ottenere una lista di versione corrente con ''perlbrew list-modules'. Un modo per ottenere una buona lista delle versioni correnti dei moduli installati sotto - say - '~/perl5 /' è cercare tutti i file 'install.json' ed elaborarli. * ad esempio * find ~/perl5/-name install.json -exec jq -M '.name + "@" + .version' {} + '. Questo presuppone che esista 'install.json'. Ottimizzare il formato di output che piace a "perlbrew exec cpanm'" sarebbe probabilmente necessario –

risposta

5

Con perlbrew è possibile utilizzare il comando lib per creare un local::lib da utilizzare con il perlbrew perl.

perlbrew lib create [email protected]_reqs 

Poi, se tutto va bene, quando si installa i moduli si trovano in:

$HOME/.perlbrew/libs/[email protected]_reqs 

Se non si utilizza l'approccio perbrew lib create per la gestione dei moduli, allora essi vengono installati $HOME/perl5/perlbrew/perls/perl-5.20.1/lib/site_perl/5.20.2. La clonazione di una di queste directory potrebbe funzionare, ma probabilmente è meglio reinstallare tutti i moduli utilizzando le tecniche dallo perlbrew.pl website poiché i moduli XS devono essere ricostruiti ecc..

Se si desidera riutilizzare e tenere traccia delle sorgenti locali, l'approccio più affidabile consiste nel creare un mirror CPAN locale da utilizzare utilizzando App::lcpan o minicpan. Se avete già scaricato il sorgente utilizzando cpanm un approccio hacker rapido è quello di trovare i file di origine (sotto $HOME/.cpanm/) e di fare qualcosa di simile nel tuo guscio:

% mkdir ~/cpansourcefiles 
% for source in ~/.cpanm/work/*/* ; do cp $source ~/cpansourcefiles ;done 

Allora si può ottenere cpanm installare l'utilizzo di tali fonti di passando il nome del file come argomento invece del nome del modulo:

% cpanm ~/cpansourcefiles/List-MoreUtils-0.406.tar.gz 

o anche:

% cpanm ~/cpansourcefiles/* 

NB: YMMV poiché questo è soggetto a rotture e potrebbe saltare parte della verifica della versione e delle dipendenze che si ottiene normalmente con cpanm ma è più semplice che configurare un mirror quando funziona.


Alcuni altri strumenti ad alta potenza che rendono la distribuzione di applicazioni Perl robusto ed affidabile:


EDIT:

Strumenti come perlbrew, pinto, carton e cpanm rappresentano un enorme miglioramento rispetto a una raccolta personale eterogenea di script per fare cose simili. Grazie a tutti gli sviluppatori e contributori a questi strumenti!

Io non sono a conoscenza di tutte le funzioni di cpanm o perlbrew che consentono di produrre in modo affidabile un elenco dei file installati e le loro versioni. Qualcosa di simile:

cpanm --list_installed 
perlbrew list_installed_versions 

o:

cpanm --export-cpanfile 
perlbrew list_installed_as_cpanfile 

potrebbe essere una caratteristica di benvenuto.

Come ho notato in un commento all'OP sopra, è possibile ottenere informazioni utili sull'installazione del modulo dai file install.json installati da cpanm. Anche i moduli come CPAN::Meta, Module::Metadata e Distribution::Metadata possono essere utili.

Il suggerimento di usare find e jq (che era da @Ilmari Karonen vedere Upgrade all modules installed by local::lib in this answer) ha portato alla mod incompiuta rapido qui di seguito. Una sfida/problema è che non c'è a volte install.json file lasciati in giro in più posizioni:

  • lib/perl5/$Config{archname}/.meta/Whatever-Mod-1.0050000/install.json
  • lib/perl5/$Config{archname}/.meta/Whatever-Mod-1.0090000/install.json
  • ... ecc

Ciò è probabilmente perché questi file sono non sempre rimosso in modo pulito durante l'aggiornamento, la reinstallazione o altri problemi relativi agli errori PEBKAC. Per funzionare correttamente, il codice riportato di seguito deve essere modificato in modo che venga visualizzato quando sono presenti più combinazioni di versioni di nome di install.json di un modulo e quindi verifica in modo più approfondito che il modulo sia installato e ottenga la sua versione. Lo script dovrebbe avere opzioni: $dir potrebbe provenire da @ARGV. TIMTOWTDI, "well volunteered", ecc..

#!perl 
# list_installed_mods.pl 
# DOES NOT THOROUGHLY VERIFY CURRENT VERSION 

use File::Find;          
use JSON;          
use v5.16;  
my $dir = "$ENV{HOME}/perl5/lib/perl5";  

for my $installed (find_installed($dir)) {  
    say parse_install_json($installed);  
} 

sub find_installed { 
    my $libdir = shift;  
    my @files; 
    File::Find::find ({ wanted => 
    sub { push @files, $File::Find::name if /install\.json/i} }, 
    $libdir); 
    return @files; 
} 

sub parse_install_json { 
    my $filename = shift; 
    my $json_text = do { 
    open(my $json_fh, "<:encoding(UTF-8)", $filename)     
     or die("Can't open \$filename\": $!\n");       
    local $/; 
    <$json_fh>               
    }; 
    my $install = decode_json($json_text) ; 
    return ($install->{name} ,"\@", $install->{version}) ; 
} 
+0

vedere anche: ['cpanm-meta-checker'] (https://metacpan.org/release/App-cpanm-meta-checker). .. –

1

Forse non il modo migliore, ma ecco cosa ho fatto di recente.

Ho eseguito il commit della mia versione Perlbrewed Perl su un repository git, quindi ho potuto usare git archive per creare un tar per me.Allo stesso modo con i miei moduli Local::Lib. Poi ho scritto un po 'di script in modo che potessi taggare master, creare archivi da un tag, copiare l'archivio sul server remoto, decomprimere e chmod/chown i file.

Ho fatto questo perché all'epoca era una soluzione rapida e sporca non avere il tempo di impostare Pinto o Cartone.

+0

++ Non riesco a vedere come questo non funzionerebbe se si hanno solo moduli perl (senza XS) e una semplice installazione. Il mio approccio (vedi la mia risposta) - che era quello di copiare i file sorgente da ~ ~/cpanm' e installarli direttamente per evitare il download - mi è sembrato altrettanto hackerato ma ho lavorato per un'installazione perlbrew 'local :: lib' che aveva solo alcune dozzine di moduli installato. Ho usato 'perlbrew' per creare perl stesso (la stessa versione ovviamente) dal sorgente. –

+1

Ho usato perlbrew per inserire tutto ciò di cui avevo bisogno, localizzato in una directory perlbrew, inclusi XS e moduli perl pure. perlbrew mantiene ogni versione di perl compartimentata, quindi potrei semplicemente tarare un tag git iniziando dalla directory principale di una versione. Alcune righe di script per impostare le vere perlbrew vars corrette sul server di destinazione, e tutto ha funzionato. Woudl Mi è piaciuta una soluzione utilizzando gli standard in evoluzione? Sì. Ma non era nelle carte per quel progetto. –

1

È solo una parte della soluzione, ma la cosa è stata citata finora: lo script di configurazione di Perl ha un parametro -D relocateableinc da alcune versioni. Quando costruisci/produci un Perl con quell'opzione i percorsi lib non saranno percorsi assoluti hardcoded ma relativi al binario perl che ti permette di spostare l'intera directory o semplicemente rinominarla. Sto costruendo tutti i miei Perl con quell'opzione da anni e finora non ha creato alcun problema.