Ruby equivalente de virtualenv?

165

¿Hay algo similar a la utilidad de Python virtualenv ?

Básicamente le permite instalar paquetes de Python en un entorno de espacio aislado, por lo easy_install djangoque no va en el directorio de paquetes de sitio de todo el sistema, iría en el directorio creado por virtualenv.

Por ejemplo:

$ virtualenv test
New python executable in test/bin/python
Installing setuptools...cd .........done.
$ cd test/
$ source bin/activate
(test)$ easy_install tvnamer
Searching for tvnamer
Best match: tvnamer 0.5.1
Processing tvnamer-0.5.1-py2.5.egg
Adding tvnamer 0.5.1 to easy-install.pth file
Installing tvnamer script to /Users/dbr/test/bin

Using /Library/Python/2.5/site-packages/tvnamer-0.5.1-py2.5.egg
Processing dependencies for tvnamer
Finished processing dependencies for tvnamer
(test)$ which tvnamer 
/Users/dbr/test/bin/tvnamer

¿Hay algo así para RubyGems?

dbr
fuente

Respuestas:

84

RVM trabaja más cerca de cómo funciona virtualenv, ya que le permite poner en la arena diferentes versiones de rubíes y sus gemas, etc.

Van Nguyen
fuente
55
Intenté tanto sandbox como RVM y creo que RVM es una solución mucho mejor.
ivanjovanovic
9
ivanjovanovic. ¿Por qué encontraste RVM mejor que sandbox?
pwan
67

Ni sandbox, RVM ni rbenv administran las versiones de las dependencias de gemas de su aplicación. La herramienta para eso es bundler .

  • usa un Gemfile como la declaración de dependencia de tu aplicación
  • use bundle installpara instalar versiones explícitas de estas dependencias en una ubicación aislada
  • use bundle execpara ejecutar su aplicación
pje
fuente
66
Además, personalmente creo que la gente usa en exceso rbenv / rvm. Si no necesita tener versiones múltiples y aisladas de ruby ​​en la misma máquina, y probablemente no, no use rbenv / rvm. Su "abstracción" no viene gratis; Te garantizo que tendrás que pasar tiempo depurándolos en algún momento. Mi consejo: simplemente instale ruby ​​con el administrador de paquetes de su sistema operativo. Lo último es lo mejor.
pje
66
¿Me estoy perdiendo de algo? Bundler todavía intenta instalar paquetes en todo el sistema de forma predeterminada.
desvío
66
Los entornos aislados son prácticamente no opcionales en un flujo de trabajo moderno. Si confía en el sistema Ruby y el administrador de paquetes del sistema, NO tiene garantías de que sus instalaciones sean repetibles y eso lo morderá en el momento de la implementación. Por supuesto , ocasionalmente te atascarás luchando contra el monstruo de instalación. Eso también es algo bueno. Porque resuelve los problemas en su entorno de desarrollo, por lo que nunca tiene que resolverlos en su entorno en vivo. Para repetir, si le pagan por el código, nunca use el entorno del sistema. Use un entorno aislado, por el bien de la cordura.
Shayne
19

Nadie parece haber mencionado rbenv .

Xuan
fuente
rbenv es un administrador de ruby, pero a nivel de paquete (el equivalente de virtualenv) no ofrece de forma nativa un administrador de gemas para poder ofrecer un entorno virtual.
yekta
16

Creo que te gustará sandbox .

dylanfm
fuente
9
Santa mierda, que reescribe $HOME? ¿Para qué demonios las gemas necesitan eso ? Lo triste es que es lo mejor que he visto para el trabajo. Incluso el paquete por defecto se instala en la ruta ruby ​​del sistema.
Chris R
66
sandbox no se ha actualizado en ~ 4 años (la última confirmación fue en diciembre de 2008), RVM todavía está en desarrollo activo (la última confirmación fue ayer)
dbr
16

Mencionaré la forma en que hago esto con Bundler (que uso con RVM - RVM para administrar los rubíes y un conjunto predeterminado de gemas globales, Bundler para manejar gemas específicas del proyecto)

bundler install --binstubs --path vendor

Al ejecutar este comando en la raíz de un proyecto, se instalarán las gemas que figuran en su Gemfile, se colocarán las librerías ./vendory todos los ejecutables ./biny todos los requires (si los usa bundle consoleo el Bundler lo requiere) harán referencia a estos exes y libs.

Funciona para mi.

iain
fuente
Un pequeño consejo para aquellos en macOS, si vendor.noindexnombras la ruta que tus búsquedas de Spotlight no estarán llenas de datos indexados de las gemas vendidas.
desde el
1
Esto es lo que yo hago también (con rbenv, pero esa es otra historia), ya que aísla el conjunto de gemas y la versión rubí. Nada está instalado en todo el sistema y cada proyecto tiene todas sus dependencias bien declaradas. Consejo: bundle config path vendorno olvides nunca ese argumento.
nandilugio
15

Si solo necesita instalar gemas como no root, intente configurar la GEM_HOMEvariable de entorno. Entonces solo corre gem.

Por ejemplo:

$ export GEM_HOME=$HOME/local/gems
$ gem install rhc
mpb
fuente
¡Increíble! En OSX esa carpeta está oculta:export GEM_HOME=$HOME/.local/gems
Bruno
1
Puede ser más fácil de usar, GEM_HOME=$HOME/.localpor lo que comparte la misma .bincarpeta. En ese caso no tenemos que actualizar nuestra $PATHvariable.
Bruno
Con mucho, el enfoque más limpio de no dependencias que he visto hasta ahora para instalar herramientas que no se rompen entre sí cuando se actualizan (todo lo que queda es agregar un alias en tu ~/.bashrcy listo). +1
Paradoxis
4

Recomiendo direnv . Es un conmutador de entorno para el shell.

Antes de cada solicitud, verifica la existencia de un archivo ".envrc" en los directorios actual y principal. Si el archivo existe (y está autorizado), se carga en un shell secundario de bash y todas las variables exportadas son capturadas por direnv y luego están disponibles en el shell actual.

Aquí se explica cómo usar direnv con ruby-install

+ ruby-install

Agregue esto a la ~/.direnvrc

use_ruby() {
  local ruby_root=$HOME/.rubies/$1
  load_prefix "$ruby_root"
  layout_ruby
}

Instale ruby-install ( brew install ruby-install) e instale un montón de rubíes.

ruby-install ruby 1.9.3
ruby-install ruby 2.0.0
ruby-install ruby 2.2.0

Y luego crea un par de enlaces simbólicos para mayor comodidad:

ln -s .rubies/1.9 ruby-1.9.3-p*
ln -s .rubies/2.0 ruby-2.0.0
ln -s .rubies/2.2 ruby-2.2.0

Y finalmente en cualquier proyecto .envrc:

use ruby 2.0

Esto colocará todas las gemas en el .direnv/rubydirectorio del proyecto (facilita la apertura de gemas). bundler colocará binarios de envoltura .direnv/bin(¡no más bundle exec!).

+ rbenv

También es posible usar rbenv agregando el use rbenvcomando en cualquier .envrcarchivo. Esto activará rbenv que a su vez colocará los envoltorios de rubí en la RUTA.

Tenga en cuenta que no es necesario instalar rbenv en .bashrc o .zshrc para que esto funcione.

+ RVM

Aquí está el .envrc más complicado que uso en proyectos de ruby:

rvm use 1.8.7
layout ruby
PATH_add .direnv/bundler-bin

rvm se usa para seleccionar la versión de rubí adecuada para usted

Los comandos de diseño configuran automáticamente algunas de las variables de entorno habituales. Por ahora solo existe el diseño de rubí. Lo que hace es establecer la variable de entorno GEM_HOME y su directorio bin a su ruta. Debido a que depende de la versión ruby, asegúrese de llamarlo después de "rvm". Dado que cada directorio de diseño de ruby ​​tiene su propio GEM_HOME, no necesita usar los gemas de rvm.

PATH_add antepone y expande la ruta relativa dada. En ese caso, uso esto para segregar los binstubs del paquete de mis propios scripts bin conbundle install --binstubs .direnv/bundler-bin

Si quiere saber qué hacen exactamente esos comandos, por ahora: cat direnv stdlib| Menos

Shin Kim
fuente
2
Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia. - De la opinión
jezrael
@ jezrael Gracias por tu comentario!
Shin Kim
1
Super, no hay problema.
jezrael
1

Mineshaft es un proyecto en el que he estado trabajando durante algún tiempo y continúo trabajando en el desarrollo.

Ofrece la capacidad de crear entornos virtuales similares al funcionamiento de virtualenv y también puede instalar Ruby a nivel mundial.

ctesterman
fuente