ruby on rails - arch - Relaciones entre Rubygems, Bundler y RVM
install ruby in manjaro (2)
Siguiendo las mejores prácticas actuales, ¿cuál es el rol adecuado para cada uno de estos?
Según mi conocimiento limitado de Bundler y RVM, parece que ellos, como Rubygems, tienen sus propias ubicaciones de instalación de gemas. Además, para cada una, existe la opción de instalar en las rutas del sistema usando sudo
o en su directorio de inicio. Y luego está la capacidad de vender gemas con Bundler (donde corresponda, por ejemplo, con Rails).
Me parece que ahora hay al menos siete lugares para instalar gemas:
- Ruta del sistema Rubygems
- Ruta de usuario de Rubygems
- Ruta del sistema RVM
- Ruta de usuario RVM
- Ruta del sistema Bundler
- Ruta de usuario de Bundler
- Proveedor (por aplicación)
Entonces, ¿cuál es la mejor manera de manejar todo esto? ¿Usamos los tres (Rubygems, Bundler, RVM) y les decimos a todos que instalen gemas en el mismo lugar? ¿ sudo
todo el tiempo, parte del tiempo o nunca? ¿Y deberíamos estar utilizando una estrategia diferente en las máquinas de producción y desarrollo?
En una nota relacionada, ¿son los envoltorios Bundler y RVM alrededor de Rubygems, son alternativas a esto, o son completamente ortogonales?
Desde el sitio web de Bundler:
Bundler facilita asegurarse de que su aplicación tenga las dependencias que necesita para iniciarse y ejecutarse sin errores.
Esto significa que es trivial para algún otro desarrollador, o para usted en otra máquina, prepararse para desarrollar más o usarlo, ejecutando bundle install
y tiene todo lo que necesita para comenzar a trabajar.
RVM es para administrar múltiples versiones de Ruby en la misma máquina y cambiar entre ellas. Gemsets es una característica poderosa que RVM proporciona que aísla gemas para una aplicación / biblioteca del resto de su sistema.
Cuando se usan RVM y Bundler juntos, RVM le dice a Bundler dónde deben ir las gemas, y Bundler los instala en la carpeta RVM.
Ambos (con respecto a las gemas en el caso de RVM) usan y dependen de Rubygems, por lo que son los más cercanos a los envoltorios.
Yo, personalmente, uso Bundler y RVM para todos mis proyectos. Sin gemsets, solo Bundler para resolver y arreglar las cosas, lo que hace sin fallar. La instalación de gemas se realiza sin sudo
, y termina en el lugar que RVM define. La instalación predeterminada de Ruby en mi sistema se deja sola y no se instala nada en la ruta del usuario / sistema de Rubygems
La forma en que lo hago ahora (aunque todavía estoy experimentando un poco) es la siguiente:
Use RVM para configurar la versión de ruby y un gemset para usar en una aplicación. Utilizo un archivo .rvmrc en la raíz del directorio de la aplicación para asegurarme de que se use el ruby y el gemset correctos todo el tiempo.
Bundler se instala usando gema sin sudo en el conjunto de gemas dado.
Cualquier gema que necesite la aplicación se agrega a las aplicaciones Gemfile y se instala usando Bundler. No estoy usando sudo para esto.
De esta manera, uso Bundler para hacer un seguimiento de las dependencias de cada aplicación, y RVM para aislar las gemas de cada aplicación entre sí. Funciona muy bien, en realidad.
Todavía no he instalado RVM en mi servidor de despliegue, allí solo uso Bundler para asegurarme de que se manejen las dependencias de cada aplicación. Probablemente también instalaré RVM allí, pero primero tengo que descubrir cómo juega la pelota con el Pasajero.
En cuanto a tu última pregunta, Bundler es una envoltura alrededor de la gema, RVM simplemente manipula el gempath donde se instalan las gemas. Sin embargo, parece ser lo suficientemente inteligente como para recoger las gemas del mismo lugar, así que no necesito volver a compilar ninguna que ya esté instalada en algún otro gemset.
He dejado de usar sudo para instalar gemas después de comenzar a usar RVM. Realmente no hay razón para instalarlos en la ruta del usuario de rvm. No estoy seguro de cuál es la mejor práctica si tiene más desarrolladores en la misma máquina, como un servidor de prueba o algo así.