TL; DRrbenv: Sobrevivir sin gemsets
- No se moleste con gemsets; múltiples versiones de una gema pueden ser instaladas concurrentemente.
- Cuando sea necesario, especifique qué versión ejecutar con la notación
$ gem-based-binary _version_ args
. - Use
bundle exec
cuando tenga un Gemfile que especifica la versión.
gem install rails -v 3.2.13
rails _3.2.13_ new Project2
cd Project2
bundle exec rails server
ACTUALIZACIÓN: 2015-06-04
escribí esta pregunta hace tres años. En parte, se basaba en una suposición falsa, y en parte la situación ha cambiado desde entonces. Con el agradecimiento de @indirect por su respuesta original, quiero llamar la atención sobre la respuesta más reciente (menos votada) de @ kelvin, resumida anteriormente.
Mi suposición errónea: Solo se podía instalar una única versión de una gema a la vez, de ahí la necesidad de que las gemas aislaran el espacio de nombres. No es verdad. Se pueden instalar varias versiones de una gema al mismo tiempo. El más reciente se usará cuando se invoque desde una línea de comando, a menos que tenga un Gemfile que especifique las restricciones de versión e invoque el comando a través de bundle exec
, o especifique la versión como su primer argumento.
Véase también How can I call an older version of a gem from the commandline? re: la notación de la versión de subrayado.
pregunta original:
tengo varios proyectos en marcha sobre el uso de diferentes versiones de los carriles. Tengo un flujo de trabajo (descrito a continuación) para crear proyectos utilizando versiones específicas de rieles y mantener los proyectos aislados el uno del otro. Me gustaría experimentar con otros flujos de trabajo, en particular, utilizando rbenv en lugar de RVM, pero no está claro cómo hacerlo.
PREGUNTA: Cuál es el las mejores prácticas actuales para la creación de múltiples proyectos de carriles, cada uno usando una versión diferente de los carriles, al hacer uso de rbenv y bundler, en contraposición a rbenv-gemset o RVM ?
USE CASE: Tengo dos proyectos de rieles, llamados ProjectA y ProjectB. ProjectA se desarrolla utilizando una versión de rieles ("RailsA"), mientras que ProjectB usa una versión diferente ("RailsB"). ¿Cómo logro tener ambas versiones instaladas?
EL ENFOQUE GEMSETS: Cuando comencé con el desarrollo de Rails, utilicé RVM. Además de admitir instalaciones simultáneas múltiples de ruby, RVM admite tener múltiples Named Gem Sets.Cada proyecto tiene su propia colección independiente de gemas (incluida la propia rieles) llama un gemset:
rvm gemset create RailsA
rvm gemset use RailsA
# RailsA. Note: My question is not version-specific.
gem install rails --version 3.0
rails new ProjectA
cd ProjectA
rvm --rvmrc use `rvm current`
vi Gemfile
bundle install
cd ..
## Now do the same for ProjectB
rvm gemset create RailsB
rvm gemset use RailsB
gem install rails --version 3.2
rails new ProjectB
cd ProjectB
rvm --rvmrc use `rvm current`
vi Gemfile
bundle install
Nota: El mismo creación de las carpetas del proyecto debe hacerse (en mi humilde opinión) por un comando rails new
utilizando el desear versión de rieles, ya que los archivos esqueleto cambian de una versión a otra. (Tal vez debería volver a esta premisa?)
ENFOQUE bundler: He estado jugando con el uso de rbenv en lugar de RVM, pero no comprender el flujo de trabajo de la forma más clara. En el README.md, Sam Stephenson escribe que "rbenv no ... administra conjuntos de gemas. Bundler es una forma mejor de administrar dependencias de aplicaciones". Hay un complemento (rbenv-gemset) para obtener los mismos resultados que las gemas de rvm, pero Sam claramente prefiere utilizar Bundler. Desafortunadamente, no explica en detalle cómo sería el flujo de trabajo. Incluso el sitio web Bundler no conecta explícitamente todos los puntos de cómo aislar un proyecto de otro. Varios blogsandgists vienen al rescate, lo que sugiere la ~/.bundle/config
siguiente archivo:
---
BUNDLE_PATH: vendor/bundle
(Por cierto, no estoy seguro de lo que el "---" es acerca de los documentos no hacen mención de ella y que doesn. parece hacer una diferencia.)
Esto da a cada proyecto de rieles su propio gemset, almacenando las gemas en ProjectX/vendor/bundle /. De hecho, los rieles se reinstalarán allí, haciendo que el proyecto sea completamente independiente del resto de mi entorno, una vez que ejecuto bundle install
.
Pero el elefante en la habitación es el problema de la gallina y el huevo de la creación de la carpeta del proyecto rieles en el primer lugar !! Para crear la carpeta ProjectA usando RailsA, necesito instalar los rieles (y sus numerosas dependencias) primero. Pero cuando quiero crear ProjectB, debo pasar a utilizar RailsB. Sin gemas, debo hacer una actualización/degradación seria. No genial.
Una posible solución es simplemente no preocuparse por la versión de los rieles que uso para crear la carpeta ProjectX. Si luego uso Rails 3.0 para crear un proyecto 3.2, podría simplemente crear manualmente el árbol de aplicaciones/activos. Pero eso solo me molesta. ¿No hay una mejor manera?
Parece que REALMENTE quiere usar RVM y gemas. ¿Alguna razón particular por la que elige NO utilizar la herramienta que resuelve su problema de la manera más elegante? –
No estoy comprometido con ninguna herramienta en particular (y absolutamente no quiero entrar en una discusión "RVM vs rbenv"). Estoy más familiarizado con RVM y entiendo un flujo de trabajo para usarlo. Me gustaría entender el flujo de trabajo equivalente para rbenv, si acaso solo para tener fluidez con una variedad de herramientas. –
Usted dice que el sitio web de Bundler no explica cómo "aislar un proyecto de otro". Si "aislar" significa que cada proyecto tiene una copia separada de la misma gema y versión (por ejemplo, rack-1.4.0), Bundler no lo hace. Mantiene una copia única de cada joya en el disco, y cualquier aplicación que necesite esa joya y versión puede usarla sin interferir con otras aplicaciones.Es como ejecutar 2 instancias de 'bash'; no tienes múltiples copias de 'bash' en el disco, sino múltiples copias en la memoria. Los conjuntos de genes le permiten tener múltiples copias en el disco (que pueden ser más fáciles de eliminar cuando ya no son necesarias) – Kelvin