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}) ;
}
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
@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 –