2009-09-14 19 views
21

¿Hay algo equivalente o cercano en términos de funcionalidad al virtualenv de Python, pero para Perl?¿Cómo puedo instalar entornos especializados para diferentes aplicaciones de Perl?

He hecho algunos desarrollos en Python y la posibilidad de tener instaladas versiones de módulos que no sean del sistema en un entorno separado sin crear ningún problema es una gran ventaja. Ahora tengo que trabajar en un nuevo proyecto en Perl, y estoy buscando algo como virtualenv, pero para Perl. ¿Puedes sugerir algún equivalente o reemplazo de Perl para virtualenv de python?

Estoy tratando de configurar X conjuntos diferentes de paquetes Perl que no sean del sistema para implementar diferentes aplicaciones Y. Peor aún, estas aplicaciones pueden requerir versiones diferentes del mismo paquete, por lo que cada una de ellas puede requerir ser instalada en un entorno de biblioteca/módulo separado. Es posible que desee hacer esto manualmente para X < Y < 3. Pero no debe hacerlo de forma manual durante 10> Y> X.

Lo ideal sería que lo que estoy buscando debe funcionar así:

perl virtualenv.pl my_environment 
. my_environment/bin/activate 
wget http://.../foo-0.1.tar.gz 
tar -xzf foo-0.1.tar.gz ; cd foo-0.1 
perl Makefile.pl 
make install # <-- package foo-0.1 gets installed inside my_environment 
perl -MCPAN -e 'install Bar' # <-- now package Bar with all its deps gets installed inside my_environment 
+0

¿Puede explicar lo que está tratando de hacer? –

+0

Estoy intentando configurar X conjuntos diferentes de paquetes perl que no sean del sistema para implementar diferentes aplicaciones Y. Peor aún, estas aplicaciones pueden requerir versiones diferentes del mismo paquete, por lo que cada una de ellas puede requerir ser instalada en un entorno de biblioteca/módulo separado. Es posible que desee hacerlo manualmente para X Y> X. Estaba buscando una herramienta que automatice y simplifique esto, y parece que local :: lib es exactamente esa herramienta. – abbot

+0

No creo que local :: lib sea lo que estás buscando. Si desea que cada aplicación en el mismo host no comparta nada, no lo hará por usted sin mucho trabajo. –

Respuesta

21

Hay una herramienta llamada local::lib que envuelve todo el trabajo para usted, al igual que virtualenv. Lo hará:

  • Configure @INC en el proceso donde se utiliza.
  • Establezca PERL5LIB y otros elementos similares para procesos secundarios.
  • Establezca las variables correctas para convencer a CPAN, MakeMaker, Module::Build, etc. para instalar bibliotecas y almacenar la configuración en un directorio local.
  • Establezca PATH para que se encuentren los binarios instalados.
  • Imprima las variables de entorno a stdout cuando se usa desde la línea de comandos para que pueda poner eval $(perl -Mlocal::lib) en su .profile y luego olvidarse de ello.
+1

'perlbrew' lo vale; http://perlbrew.pl –

1

Los programas pueden modificar qué directorios verifican para las bibliotecas con use lib. Este directorio lib puede ser relativo al directorio actual. Las bibliotecas de estos directorios se usarán antes que las bibliotecas del sistema, ya que se ubican al comienzo de la matriz @INC.

Creo que cpan también puede instalar bibliotecas en directorios específicos. De acuerdo, cpan extrae del CPAN site para instalar cosas, por lo que esta puede no ser la mejor opción.

+0

'@ LIB' no hace nada. ITYM '@ INC' – hillu

+0

Conozco estas opciones. Sí, lo sé, puedo escribir algunos scripts simples para inicializar la estructura del entorno y el directorio, incluso puedo convencer al CPAN para que use esa estructura de directorios, y puedo hacer muchas otras cosas interesantes. Pero necesito hacer esto manualmente. Una de las características clave de virtualenv es esa parte 'sin crear ningún problema'. Oculta todos estos pasos de configuración de bajo nivel y simplifica enormemente el uso de dichos entornos. Estoy buscando algo similar para Perl. Simplemente no puedo creer que no exista. – abbot

+0

@hillu: er ... Ups, braino de mi parte. – Powerlord

1

No estoy seguro de si este es el mismo que el virtualenv lo que está hablando, pero tienen un aspecto para la variable especial en el @INCperlvar página de manual.

0

Lo que hago es iniciar el shell de CPAN (CPAN) e instalar mi propio Perl 5.10 de ella (creo que el comando es instalar perl-5.10). Esto pedirá varias configuraciones de configuración ; Me aseguro de hacer que apunte a las rutas en/usr/local (o en alguna otra ubicación de instalación que no sea la predeterminada).

Luego pongo su ubicación resultante en mi $ PATH ejecutable antes del perl estándar, y uso su shell CPAN para instalar los módulos que necesito (generalmente, mucho). Mi Perl comandos de todas comienzan con la línea

#!/usr/bin/env perl 

nunca tuvo un problema con este enfoque.

+0

Instalar su propio Perl no está en la opción si necesita 5-10 entornos diferentes. – abbot

+1

¿Quiere decir que no está completamente automatizado? Sí, eso es un inconveniente. Estoy seguro de que sería fácil de automatizar (solo una cuestión de averiguar cómo proporcionar opciones de configuración a la instalación de Perl), pero nunca lo hice. – reinierpost

+0

BTW Siempre instalo software en un subdirectorio específico de la versión, luego uso algo como stow para enlazar una versión en una ubicación que está en mi camino. De esa manera, aún puedo usar versiones específicas cuando sea necesario. – reinierpost

1

He usado schroot para este propósito. Es un poco más pesado que virtualenv, pero puedes estar seguro de que no se filtrará nada que no debería.

Schroot gestiona un entorno chroot para usted, pero monta su directorio de inicio en el chroot para que parezca una sesión de shell normal, simplemente usando los binarios y las bibliotecas en el chroot.

Creo que puede ser debian/ubuntu solamente.

Después de configurar la schroot, la secuencia de comandos anterior se vería

schroot -c my_perl_dev 
wget ... 

Ver http://www.debian-administration.org/articles/566 para un artículo interesante de esto

0

Parece que sólo tiene que utilizar la configuración de INSTALL_BASE Makefile.PL (o la opción --install_base para Build.PL)? ¿Qué es exactamente lo que necesita la solución para usted? Parece que solo necesita obtener el módulo instalado en el lugar correcto. Ha presentado su problema como XY Problem al especificar cuál cree que es la solución en lugar de dejar que lo ayudemos con su tarea.

Véase How do I keep my own module/library directory? en perlfaq8, por ejemplo.

Si va a descargar los módulos de CPAN, el comando más reciente cpan (en App::Cpan) tiene un interruptor -j para que pueda elegir los archivos de configuración CPAN.pm alternos. En esos archivos de configuración puede configurar las opciones de CPAN.pm para instalar donde desee.

Según su aclaración, suena como que local :: lib podría funcionar para usted en casos únicos y simples, pero lo hago para implementaciones industriales donde configuro CPAN privados y personalizados por aplicación, e instalo directamente desde esos CPAN personalizados Ver mi módulo MyCPAN::App::DPAN, por ejemplo. A partir de eso, utilizo las configuraciones CPAN.pm personalizadas que analizan su entorno y establecen los valores adecuados para cada aplicación. Pueden instalar todo en un directorio solo para esa aplicación.

También podría considerar distribuir su aplicación como Tarea ::. Lo instala como cualquier otro módulo de Perl, pero las dependencias comparten la misma configuración (es decir, INSTALL_BASE).

+1

Sé de todo esto, pero es bastante bajo. Quería una herramienta que pueda realizar rápidamente todos estos pasos de configuración/configuración de bajo nivel con un simple comando. Sé que presenté esto como un problema XY, pero si compruebas la respuesta aceptada, entonces encontrarás que funciona casi exactamente como lo describí. Deberías probar esa solución tú mismo si aún no lo has hecho. – abbot

+0

No veo cómo funciona para usted si desea instalar más de 10 configuraciones diferentes en la misma máquina, como dice en el comentario de su propia pregunta. –

1

También compruebe perl-virtualenv, esto parece ser envoltorio alrededor de local :: lib según lo sugerido por Hobbs, pero crea un contenedor/activar y bin/desactivar para que pueda usarlo como la herramienta de python.

Lo he usado con bastante éxito durante aproximadamente un mes sin darme cuenta de que no era tan normal como debería ser.

Hace que sea mucho más fácil configurar un virtualenv de trabajo para perl como local: lib le dirá qué variables necesita establecer, etc. perl-virtualenv crea un script de activación que lo hace por usted.

2

Si bien la investigación, descubrí esto y algunas otras páginas (this one is too old y echa de nuevas tecnologías, this reddit post is a slight misdirect).

El problema con perlbrew y plenv es que parecen ser reemplazos para pyenv, no virtualenv. Como se indicó here pyenv es para administrar versiones de Python, virtualenv es para administrar versiones de módulos por proyecto. Entonces, sí, de alguna manera similar a local::lib, pero con una mejor usabilidad.

no he visto una respuesta adecuada a esta pregunta todavía, pero por lo que he leído, parece que la mejor solución es algo a lo largo de las líneas de:

  • Perl gestión de versiones: plenv/perlbrew (con la mayoría de las personas a favor de la plenv basado fiesta más contemporánea sobre el perl basado perlbrew de lo que puedo ver)
  • módulo de gestión de versiones: Carton
  • instalación del módulo: CPAN (bueno, cualquier cpanminus Así, ymmv)

Para ser honesto, esto no es una ideales establecido, aunque todavía estoy aprendiendo, por lo que todavía puede ser superior. Simplemente no se siente bien. Ciertamente no es un reemplazo similar para virtualenv.

Hay un par de publicaciones que he encontrado diciendo "itispossible" pero ninguna ha ido más allá.

Cuestiones relacionadas