¿Cómo le digo a CPAN que instale todas las dependencias?


113

¿Cómo le digo a CPAN que instale todas las dependencias?

Intenté configurar estos en cpan:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

Todavía tuve que responder "y" un par de veces (pero menos que antes, parece).

¿Hay alguna manera de hacer que siempre se instale? Quiero dejarlo desatendido.

Parecería que quiero una bandera para confiar siempre en que CPAN haga lo correcto, y si sugiere una respuesta, me gustaría seguirla (siempre presione Entercuando pregunte algo).


1
Quizás debería agregar una función a mi script cpan para establecer las variables de entorno de instalación automática según la configuración de CPAN.pm. Vea la respuesta de tsee, que es la otra mitad del problema.
brian d foy

Respuestas:


31

Aquí está el resumen que hace que estos cambios sean permanentes, incluida la configuración automática de CPAN por primera vez:

perl -MCPAN -e 'my $c = "CPAN::HandleConfig"; $c->load(doit => 1, autoconfig => 1); $c->edit(prerequisites_policy => "follow"); $c->edit(build_requires_install_policy => "yes"); $c->commit'

O combínelo con el local::libmódulo para usuarios sin privilegios:

perl -MCPAN -Mlocal::lib=~/perl5 -e 'my $c = "CPAN::HandleConfig"; $c->load(doit => 1, autoconfig => 1); $c->edit(prerequisites_policy => "follow"); $c->edit(build_requires_install_policy => "yes"); $c->commit'

Ejecútelo antes de usar el shell CPAN o lo que sea.


¿no es lo mismo que en @sdf anwer?
filimonov

83

Intente configurar PERL_MM_USE_DEFAULT así:

PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install My::Module'

Debería hacer que CPAN responda por defecto a todas las solicitudes.


¿Alguna forma de hacer que esto sea persistente, por lo que puede escribir "instalar Mi: Módulo" en cpan cada vez y recordará esto? ¿Editar Config.pm?
Geoff

3
Si está en Linux, agregue la línea export PERL_MM_USE_DEFAULT=1a su ~ / .bashrc
anders y

1
Si obtiene un error, Can't locate object method "install" via package "xxx" at -e line 1.agregue un "+" justo antes del nombre del módulo.
Yann Sagon

55

¡La última y mejor respuesta a esta pregunta es usar cpanmen su lugar (también conocida como App :: cpanminus o cpanminus)!

DESCRIPCIÓN

cpanminus es un script para obtener, descomprimir, construir e instalar módulos de CPAN y no hace nada más.

Es libre de dependencias (puede iniciarse solo), no requiere configuración y es independiente. Cuando se ejecuta, solo requiere 10 MB de RAM.

Para iniciar la instalación:

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

o si está usando perlbrewsimplemente

perlbrew install-cpanm

o del propio cpan:

cpan install App::cpanminus

A partir de ese momento, instale los módulos ejecutando (como root si es necesario)

cpanm Foo::Bar

1
Tengo este problema cuando lo uso cpanm, por lo que decirme que lo use no es la solución aquí.
reinierpost

3
en lugar de un comentario ciego, pregunte como una nueva pregunta y enlace aquí. Sospecho que un problema de permisos podría ser su problema
Joel Berger

En un Ubuntu 18.04 que instalé con sudo apt install cpanminus make.
Pablo A

Votar en contra. No recomiende que la gente ejecute la salida de curl.
Richard Smith

28

Esto es lo que estoy bastante seguro de que estás buscando:

cpan> o conf prerequisites_policy follow
cpan> o conf commit

27

A continuación, se cambia el siguiente parámetro además de prerequisites_policy.

cpan> o conf prerequisites_policy 'follow'
cpan> o conf build_requires_install_policy yes
cpan> o conf commit

Esto lo cambiará de "preguntar / sí" a "sí" y dejará de preguntarle.


¡Gracias! ¡Necesito estas dos opciones para que no me pregunte una y otra vez!
Dat TT

Tenga en cuenta que estos son los valores predeterminados para esta configuración.
ikegami


6

Conjunto

prerequisites_policy

en la configuración.

Consulte Variables de configuración .


2
¿Están las indicaciones relacionadas con la descarga de la fuente del módulo? Si es así, consulte la opción connect_to_internet_ok . De lo contrario, díganos qué otras indicaciones está tratando de evitar.
Sinan Ünür

Bueno todo básicamente, estos últimos eran "módulos opcionales".
Nifle

El problema son las cosas que se instalan automáticamente por sí mismas. CPAN.pm no tiene la oportunidad de manejar esas cosas. Vea la respuesta de tsee.
brian d foy

1
Link ahora parece estar muerto
OrangeDog

3

Personalmente, solo he intentado un par de veces modificar la configuración de esa manera y, de hecho, me resultó más fácil ingresar al CPAN.pmshell cpansin dar argumentos y luego configurar CPAN.pmdesde el indicador interactivo:

$ cpan
cpan> o conf init

Esto iniciará la CPAN.pmutilidad de configuración de interfaces. Simplemente ejecútelo y especifique "seguir" donde lo necesite (olvido la pregunta de repente), y debería estar listo.


Puede pasar configuraciones específicas a init. Por ejemplo o conf init prerequisites_policy,. De esa manera, no tiene que pasar por el largo proceso de inicialización, pero aún así recibe el aviso amigable para la configuración en cuestión
ikegami

3

Encontré que esta es, con mucho, la forma más rápida y confiable de instalar módulos CPAN:

yes | perl -MCPAN -e "CPAN::Shell->notest(qw!install Your::Module!)"

Esto no responde a la pregunta: el OP quiere una forma de instalar dependencias automáticamente / responder automáticamente a las solicitudes.
William Turrell

De hecho, instala dependencias y responde automáticamente a las solicitudes. Lo uso todo el tiempo, incluido este mismo momento. Pero es necesaria una pequeña modificación: yes|/root/bin/perl -MCPAN -e "CPAN::Shell->notest(qw!install Your::Module!)"
Vladimir Marchenko

¿Qué se yessupone que debe hacer " "?
Peter Mortensen

2

Estoy escribiendo esto en beneficio de las personas que pueden haber venido a esta página en busca de una forma de instalar todas las dependencias de módulos que necesita un script de Perl en particular. Escribí un guión para eso:

Debe ejecutarse como ./installdep.pl yourscript.pl

#!/usr/bin/perl
`sudo apt install cpanminus`;
while (<>) {
    if (/USE /i)
    {
        my $line=$_;
        $line=~ s/\s//g;
        $line=~ /^(.*)\./;
        $line=~ s/\;//;
        $line=~s/^USE//i;
        $line=~s/lib.*//i;
        $line=~s/feature.*//i;
        $line=~s/strict//i;
        $line=~s/warnings//i;
        $line =~ s/^(.*)\(.*/$1/;
        unless ($line eq '') {
        my $cmd='sudo cpanm '.$line;
        print "Installing $line \n";
        open my $cmd_fh, "$cmd |";
        while (<$cmd_fh>) {
          print "$_";
        }
        close $cmd_fh;
        print "\n";
    }
    }
}

Esto usará cpanminus para instalar todas las dependencias del módulo requeridas por su script. Si cpanm no está instalado, lo instalará.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.