¿Cómo puedo usar CPAN como usuario no root?

81

Quiero instalar módulos de Perl en un servidor compartido en el que no tengo acceso de root. ¿Cómo puedo hacer esto? También parecen tener una versión anterior de CPAN (se queja de eso cuando se ejecuta el comando), ¿es posible actualizar el comando CPAN que se usa desde mi cuenta sin requerir acceso de root?

Juan A. Navarro
fuente

Respuestas:

139

El método más fácil que he encontrado hasta ahora es decir

wget -O- http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile

Esto supone que su perfil se denomina .profile, es posible que necesite cambio que sea .bash_profile, .bashrc, etc. Después de que se puede instalar módulos diciendo

cpanm Module::Name

y simplemente utilícelos de la misma manera que lo haría si estuvieran instalados en los directorios raíz.


Lo que sigue es una breve explicación de lo que hacen los comandos anteriores.

wget -O- http://cpanmin.usobtiene la última versión de cpanmy la imprime a la STDOUTque luego se canaliza perl - -l ~/perl5 App::cpanminus local::lib. El primero -dice perlque esperemos que el programa se active STDIN, esto hace que se perlejecute la versión cpanmque acabamos de descargar. perlpasa el resto de los argumentos a cpanm. El -l ~/perl5argumento dice cpanmdónde instalar los módulos de Perl, y los otros dos argumentos son dos módulos para instalar. [App::cpanmins] 1 es el paquete que se instala cpanm. local::libes un módulo auxiliar que gestiona las variables de entorno necesarias para ejecutar módulos en el directorio local.

Una vez instalados esos módulos, ejecutamos

eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`

para configurar las variables de entorno necesarias para usar los módulos locales y luego

echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile

para asegurarnos de que podremos usarlos la próxima vez que iniciemos sesión.

echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile

con suerte hará que el hombre encuentre las páginas de manual para sus módulos locales.

Chas. Owens
fuente
+1 para cpanminus ... nunca lo usé, así que no siento que deba recomendarlo, pero me gusta por lo que vi en SO hasta ahora
DVK
7
Esto ha funcionado muy bien para mí. Solo una pequeña nota para eliminar primero cualquier variable de entorno PERL5LIB existente que ya esté en su ~ / .profile (o lo que sea). De lo contrario, local :: lib no se instalará al ejecutar el primer comando.
Juan A. Navarro
@juannavar Buen punto, tiendo a instalarlo en máquinas recién instaladas, así que no me encuentro con ese caso.
Chas. Owens
Excelente ejemplo de uso de wget en lugar de curl: muchos sistemas no vienen con curl de forma predeterminada, aunque sí lo hacen con wget, por lo que es útil para quienes no tienen root para instalar nuevos paquetes.
AndrewPK
1
@HielkeWalinga Los procesos secundarios no pueden modificar el entorno de los procesos principales. Para lidiar con esto, los comandos como perl -I ~/perl5/lib/perl5 -Mlocal::libo ssh-agentque necesitan establecer variables de entorno para un proceso principal imprimen los comandos que deben ejecutarse en el proceso principal y luego usted eval. Sin evalembargo, en realidad no los necesitas . Se podría decir perl -I ~/perl5/lib/perl5 -Mlocal::lib > /tmp/commands; source /tmp/commands, pero el método eval es más limpio (no hay archivos para limpiar o sobrescribir accidentalmente).
Chas. Owens
12

http://web.archive.org/web/20120427144232/http://perl.jonallen.info/writing/articles/install-perl-modules-without-root

http://novosial.org/perl/life-with-cpan/non-root/

El paso principal en ambos conjuntos de instrucciones involucra el módulo local :: lib

AFAIK, la lógica CPAN está contenida en el módulo Perl (CPAN.pm) lo que significa que también puede instalar fácilmente el más nuevo en su directorio local como lo haría con cualquier otro módulo Perl.


Además, una vez que instale sus módulos en una ubicación no estándar, consulte estas dos preguntas sobre la carga de bibliotecas desde ubicaciones no estándar (parte de la información ya está disponible en el enlace anterior):

¿Cómo sabe un programa Perl dónde encontrar el archivo que contiene el módulo Perl que utiliza?

¿Cómo se construye el @INC de Perl? (también conocido como ¿Cuáles son todas las formas de afectar dónde se buscan los módulos Perl?)

DVK
fuente
Divulgación: fui autor de las dos preguntas de SO vinculadas en esta respuesta.
DVK
2
Hay al menos cuatro formas diferentes de instalar módulos de CPAN: a mano, el módulo CPAN (y su equivalente en la línea de comandos cpan), el CPANPLUSmódulo (y su equivalente en la línea de comandos cpanp) y la nueva distribución App :: cpanminus que se instala cpanm. De estos, creo cpanmque es el más fácil de instalar y usar. cpany cpanpestán instalados de forma predeterminada, pero requieren una configuración significativa para funcionar correctamente.
Chas. Owens
404: La URL solicitada / writing / articles / install-perl-modules-without-root no se encontró en este servidor.
Harschware
6

Para completar, este es el proceso de instalación de cpanmOSX si desea mantenerlo perl5bajo ~/Library.

curl -L http://cpanmin.us | perl - -l ~/Library/perl5 App::cpanminus local::lib
eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`
echo 'eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`' >> ~/.bash_profile
Juan A. Navarro
fuente
2

Si también desea poder leer las páginas de manual de los módulos instalados por cpanminus, también debe asegurarse de que el subdirectorio correcto de la ruta de la biblioteca elegida esté en MANPATH. Entonces, la solución anterior que muestra el proceso de instalación de cpanm necesita el siguiente comando adicional:

 export MANPATH=$HOME/Library/perl5/man:$MANPATH' >> ~/.bash_profile
Britton Kerin
fuente
0

nosotros hemos estado usando la siguiente función durante los últimos 6 meses en más de 20 implementaciones implementaciones automatizadas exitosas en aws ... llamado desde el aprovisionamiento principal de la siguiente manera , que es básicamente una copia y pegado de las respuestas anteriores, pero en una sola repetición script bash utilizable:

 #! /usr/bin/env bash                                                                                                                                                     │··  
                                                                                                                                                                           │··
  # a bash wrapper for check-installing required perl modules as non-root  
main(){                                                                                                                                                                  │··
     doSetVars                                                                                                                                                             │··
     doCheckInstallPreReqs                                                                                                                                                 │··
     perl $PRODUCT_INSTANCE_DIR/src/perl/my-perl-script.t                                                                                                                          │··
  }                                                                                                                                                                        │··
                                                                                                                                                                           │··
  doSetVars(){                                                                                                                                                             │··
     #set -x                                                                                                                                                               │··
     umask 022    ;                                                                                                                                                        │··
     set -u -o pipefail                                                                                                                                                    │··
     run_unit_bash_dir=$(perl -e 'use File::Basename; use Cwd "abs_path"; print dirname(abs_path(@ARGV[0]));' -- "$0")                                                     │··
     export PRODUCT_INSTANCE_DIR=$run_unit_bash_dir/../..                                                                                                                  │··
  }                                                                                                                                                                        │··
                                                                                                                                                                           │··
  doCheckInstallPreReqs(){                                                                                                                                                 │··
     eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`                                                                                                                         │··
     perl -e '                                                                                                                                                             │··
        use JSON ;                                                                                                                                                         │··
        use Data::Printer;                                                                                                                                                 │··
        use Test::Most ;                                                                                                                                                   │··
        use Test::Mojo;                                                                                                                                                    │··
        use Data::Printer ;                                                                                                                                                │··
        use FindBin;                                                                                                                                                       │··
        use JSON::Parse ;                                                                                                                                                  │··
        use IPC::System::Simple ;                                                                                                                                          │··
        use Mojolicious ;                                                                                                                                                  │··
     ' || {                                                                                                                                                                │··
           curl -L http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib                                                                                         │··
           eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`                                                                                                                   │··
           echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.bashrc                                                                                               │··
           cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)                                                                         │··
           export PERL_MM_USE_DEFAULT=1                                                                                                                                    │··
           cpanm JSON Data::Printer Test::Most Test::Mojo Data::Printer FindBin JSON::Parse \                                                                              │··
              IPC::System::Simple                                                                                                                                          │··
           sudo curl -L cpanmin.us | perl - Mojolicious                                                                                                                    │··
     }                                                                                                                                                                     │··
                                                                                                                                                                           │··
  }                                                                                                                                                                        │··
                                                                                                                                                                           │··
  main
Yordan Georgiev
fuente