2011-03-27 24 views
21

Hasta ahora he estado usando el sistema de Perl (en Ubuntu 10.10) y que estaba usando locales :: lib para instalar módulos de CPAN en mi directorio privado ~/perl5perlbrew y local :: lib al mismo tiempo?

Como estoy tratando de usar perlbrew parece que se No sé el uno del otro. Instalé perl-5.12.3 usando perlbrew pero cuando cambio a él usando perlbrew use perl-5.12.3 Aún veo el PERL5LIB y PERL_MM_OPT establecido por local :: lib.

eso no es bueno:

$ cpan XML::Simple 
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/perl: symbol lookup error: /home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Cwd/Cwd.so: undefined symbol: Perl_Gthr_key_ptr 

mientras

$ which cpan 
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/cpan 

por lo que está utilizando la versión correcta del cliente CPAN, pero las cuotas a la variable de entorno PERL5LIB recoge los módulos desde el lugar equivocado .

¿Perlbrew tiene algún modo de compatibilidad o tengo que apagar PERL5LIB y PERL_MM_OPT manualmente?

Respuesta

11

local::lib no fue diseñado para funcionar con múltiples versiones de Perl instaladas al mismo tiempo. Los módulos Pure-Perl generalmente no son un problema, pero los módulos XS no son compatibles en las principales versiones.

Puede seguir utilizando local lib para los módulos Pure-Perl (para que no tenga que instalarlos para cada versión de Perl que haya creado, pero los módulos XS deben instalarse en los directorios perlbrew -created No es necesario borrar PERL5LIB (y no debe hacerlo, ya que los módulos XS pueden tener dependencias Puro-absolutas que están instaladas allí), pero deberá borrar PERL_MB_OPT y PERL_MM_OPT al instalar módulos XS para evitar que se instalen en el directorio local :: lib.

Si necesita continuar usando local lib para los módulos XS para el sistema Perl, entonces sugiero crear un segundo entorno local :: lib para eso (quizás en ~/perl5sys). ser más fácil de usar perlbre w para instalar una copia de la misma versión de Perl como el sistema Perl, y luego usar eso en lugar del sistema Perl.

Puede limpiar los módulos XS en su biblioteca local :: lib actual eliminando el directorio /home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multi.

+3

Me pregunto por qué la gente recomienda INSTALL_BASE sobre prefijo. local :: lib tiene este problema porque usa INSTALL_BASE en lugar de PREFIX. – ikegami

17

Desde que comencé a usar perlbrew dejé de usar local :: lib para el uso de shell, porque ahora que tengo mi propio perl que tengo permiso de escritura para todo, simplemente instalarlo en site_perl es mucho más sencillo, y eso me permite tener diferentes versiones de módulos para cada perl.

Todavía uso local :: lib (o más específicamente, las opciones -l o -L de cpanm que configuran automáticamente el directorio local :: lib) para mantener las dependencias específicas de la aplicación dentro de un directorio de aplicaciones.

4

Es posible, pero no es cómodo. Si se trata de una instalación para un solo usuario, es mejor que no utilice local::lib y deje que perlbrew administre los módulos por usted. Además, si se trata de una configuración multiusuario en una red homogénea, donde todos tienen la misma máquina y sistema operativo, entonces puede simplemente configurar PERLBREW_ROOT a p. Ej. /net/share/perlbrew y luego sus perls instalados (y sus módulos) se pueden compartir. Como se señala en las otras respuestas, esto será un problema si intenta mezclar máquinas (y posiblemente también problemático si tiene diferentes sistemas operativos).

En una red muy diversa, preferimos mantener todo separado.Simplemente puede configurar su local::lib para que sea una función de su perl actual y su plataforma actual, p.

distro=lsb_release -d|cut -f2|tr ' ' '-' 
arch=`uname -m` 
platform="$distro-$arch" 

export PERLBREW_ROOT=/net/share/perlbrew/$platform 
# You will have to first do 'perlbrew init' (just once for all users) 
# In this case you don't need (and shouldn't have) a ~/.perlbrew 
source $PERLBREW_ROOT/etc/bashrc 

perl5base=/net/share/perl 
# When $PERLBREW_PERL is not defined, local::lib puts modules in $perl5base/$platform 
perl5=$perl5base/$platform/$PERLBREW_PERL 

# We also found that we needed to clean PERL5LIB in between 
export PERL5LIB=`echo -n $PERL5LIB|sed "s|${perl5base}[^:]*||g"` 
export PATH=`echo -n $PATH|sed "s|${perl5base}[^:]*||g"` 

# Setup local lib, relative to the perl being used 
lib=$perl5/lib/perl5 
mkdir -p $lib 
eval $(perl -I"$lib" -Mlocal::lib="$perl5") 

Esta no es nuestra secuencia de comandos exacta, en particular, tendría que comprobar que todos estos directorios existen primero. Necesita ejecutar perlbrew init una vez por plataforma y también debe iniciar local :: lib cada vez.

No recomiendo este enfoque, pero proporcione un ejemplo de una forma de hacerlo funcionar, lo que hace para nuestra red mixta (incluso en Mac OS). Dejar local :: lib y simplemente usar perlbrew (ignorando el perl del sistema), sería un enfoque más limpio.

2

Como miyagawa said, puede que no sea necesario utilizar local :: lib si utiliza los Perls instalados por Perlbrew exclusivamente.

Pero si aún desea poder alternar entre sus perls elaborados y el sistema Perl, existe un script llamado Perlswitcher para esto. No es bonito, pero funciona. Todo lo que necesita hacer es descargar el script, puede guardarlo como ~/perl5/userperls/bashrc y obtenerlo.

Proporciona dos comandos. perlswitch le permite cambiar a un Perl que fue instalado por Perlbrew o al sistema Perl. perlinfo le indica qué Perl se está utilizando actualmente. A continuación, puede usar cpanm, que instalará paquetes en su lib local cuando use el sistema Perl o directamente en el sitio Perl cuando use un Perl personalizado.

Después de cambiar a una costumbre Perl usando perlswitch, perlbrew list también sabrá lo que Perl está siendo utilizado:

$ perlswitch perl-5.18.4 
Setting new perl /var/www/perl5/perlbrew/perls/perl-5.18.4/bin/perl... 
Using user perl (site_perl) instead of local::lib 
$ perlbrew list 
    perl-5.16.3 
* perl-5.18.4 
    perl-5.20.2 
+0

¡Sí! Esto es exactamente lo que necesitaba! Estoy teniendo problemas con el sistema perl de Debian que no puedo reproducir con perlbrew, por lo que poder cambiar al sistema perl y seguir instalando dependencias con local :: lib era importante. Este guión hizo que el proceso sea sencillo. ¡Gracias! –

Cuestiones relacionadas