/ / Mover / clonar un perlbrew instalado perl más todos los módulos cpan adicionales - perl, cpan, perlbrew

Mover / clonar un perlbrew instalado perl más todos los módulos cpan adicionales - perl, cpan, perlbrew

estoy usando perlbrew. He instalado muchos módulos cpan bajo perlbrew perl-5.20.2.

¿Hay alguna manera (o cuál es la mejor manera) de hacer una instalación de tarball de mi perl-5.20.2 más todos los módulos CPAN que he instalado bajo perlbrew para poder clonarlo en otra máquina?

Estoy consciente de perlbrew download perl-5.20.2 pero eso solo parece tarball perl-5.20.2 y no todos los modulos CPAN que he instalado.

Respuestas

5 para la respuesta № 1

Con perlbrew puedes usar el lib comando para crear un local::lib para ir con tu perlbrew perl.

perlbrew lib create perl-5.20.2@app_reqs

Luego, si todo va bien, cuando instales los módulos los encontrarás en:

$HOME/.perlbrew/libs/perl-5.20.2@app_reqs

Si no usas el perbrew lib create enfoque de gestión de sus módulos, entonces se instalan para $HOME/perl5/perlbrew/perls/perl-5.20.1/lib/site_perl/5.20.2. La clonación de cualquiera de esos directorios podría funcionar, pero probablemente sea mejor reinstalar todos los módulos utilizando las técnicas del sitio web perlbrew.pl ya que los módulos XS deben ser reconstruidos etc.

Si desea reutilizar y rastrear las fuentes locales, el enfoque más confiable es crear una réplica CPAN local para trabajar desde el uso App::lcpan o minicpan. Si ya has descargado la fuente usando cpanm Un enfoque rápido es encontrar los archivos de origen (bajo $HOME/.cpanm/) y haz algo como esto en tu shell:

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

Entonces puedes conseguir cpanm para instalar usando esas fuentes pasando el nombre del archivo como argumento en lugar del nombre del módulo:

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

o incluso:

% cpanm ~/cpansourcefiles/*

NÓTESE BIEN: YMMV, ya que es propenso a la rotura y puede omitir algunas de las comprobaciones de versión y dependencia que normalmente obtiene con cpanm pero es más sencillo que configurar un espejo cuando funciona.


Algunas otras herramientas de alta potencia que hacen que la implementación de aplicaciones Perl sea robusta y confiable:


EDITAR:

Herramientas como perlbrew, pinto, cartony cpanm son una gran mejora con respecto a una variada colección personal de guiones para hacer cosas similares. ¡Gracias a todos los desarrolladores y colaboradores de estas herramientas!

No conozco ninguna característica en cpanm o perlbrew que le permiten producir de manera confiable una lista de archivos instalados y sus versiones. Algo como:

 cpanm --list_installed
perlbrew list_installed_versions

o:

 cpanm --export-cpanfile
perlbrew list_installed_as_cpanfile

podría ser una característica bienvenida

Como señalé en un comentario al OP anterior, puede obtener información útil sobre la instalación de su módulo desde el install.json archivos que son instalados por cpanm. Módulos como CPAN::Meta, Module::Metadata y Distribution::Metadata puede ser útil también

La sugerencia de usar find y jq (que era de @Ilmari Karonen ver Actualizar todos los módulos instalados por local :: lib en esta respuesta) condujo al truco rápido sin terminar a continuación. Un problema / problema es que a veces hay install.json archivos dejados en múltiples ubicaciones:

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

Esto es probable porque estos archivos no siempre sonSe eliminó de forma limpia al actualizar, reinstalar u otro desorden sobre los errores de PEBKAC. Para funcionar correctamente, el código a continuación debe cambiarse para que se dé cuenta cuando haya varias combinaciones de versión de nombre de un módulo. install.json y luego realiza una verificación más exhaustiva de que el módulo está instalado y obtiene su versión. El script debe tener opciones: $dir podría venir de @ARGV. TIMTOWTDI, "bien voluntario", etc.

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

1 para la respuesta № 2

Posiblemente no sea la mejor manera, pero esto es lo que hice recientemente.

Confié mi versión Perlbrewed Perl a un repositorio de git, así que podría usar git archive para crear un alquitrán para mí. Del mismo modo con mi Local::Lib módulos Luego escribí un poco de secuencias de comandos para poder etiquetar master, construir archivos desde una etiqueta, copiar el archivo al servidor remoto, desempaquetar y chmod / chown los archivos.

Hice esto porque en ese momento era una solución rápida y sucia para no tener tiempo para configurar Pinto o Cartón.


1 para la respuesta № 3

Es solo una parte de la solución pero quiero mencionadahasta ahora: el script de configuración de Perl tiene un parámetro -D relocateableinc desde algunas versiones. Cuando se crea / elabora un Perl con esa opción, las rutas de acceso a la biblioteca no serán duras, pero sí relativas al binario perl, lo que le permite mover todo el directorio o simplemente cambiarle el nombre. Estoy construyendo todos mis Perl con esa opción desde hace años y no ha creado ningún problema hasta ahora.