rbenv: sobrevivir sin gemas

TL; DR

No te molestes con los gemas; Se pueden instalar varias versiones de una gema al mismo tiempo.Cuando sea necesario, especifique qué versión ejecutar con$ gem-based-binary _version_ args notación.Utilizarbundle exec cuando tienes 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

ACTUALIZAR 2015-06-04

Escribí esta pregunta hace tres años. En parte, se basó en una suposición falsa, y en parte la situación ha cambiado desde entonces. Con agradecimiento a @indirect por su respuesta original, quiero llamar la atención sobre la respuesta más nueva (menos votada) de @ kelvin, resumida anteriormente.

Mi suposición falsa: solo se puede instalar una única versión de una gema a la vez, de ahí la necesidad de gemas para aislar 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 comandos, a menos que tenga un Gemfile que especifique las restricciones de versión e invoque el comando a través debundle exec, o especifique la versión como primer argumento.

Ver también ¿Cómo puedo llamar a una versión anterior de una gema desde la línea de comandos? re: la notación de versión de subrayado.

Pregunta original:

Tengo varios proyectos en marcha usando diferentes versiones de Rails. Tengo un flujo de trabajo (descrito a continuación) para crear proyectos utilizando versiones específicas de rieles y mantener los proyectos aislados unos de otros. Me gustaría experimentar con otros flujos de trabajo, en particular, usando rbenv en lugar de RVM, pero no está claro cómo hacerlo.

PREGUNTA Cuál es el la mejor práctica actual para crear múltiples proyectos de rieles, cada uno con una versión diferente de rieles, cuando se utiliza rbenv y bundler, a diferencia de rbenv-gemset o rvm?

CASO DE USO: Tengo dos proyectos de rieles, llamados ProjectA y ProjectB. ProjectA se desarrolla utilizando una versión de rails ("RailsA"), mientras que ProjectB usa una versión diferente ("RailsB"). ¿Cómo manejo tener ambas versiones instaladas?

EL ENFOQUE DE LOS GEMSETS: Cuando comencé con el desarrollo de Rails, usé RVM. Además de soportar múltiples instalaciones concurrentes de ruby, RVM admite tener múltiples Conjuntos de gemas con nombre. Cada proyecto tiene su propia colección independiente de gemas (incluidos los rieles en sí) llamados gemas:

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 mismocreació de las carpetas del proyecto debe hacerse (en mi humilde opinión) por unrails new comando usando el versión deseada de rieles, ya que los archivos de esqueleto cambian de una versión a otra. (¿Quizás debería volver a visitar esta premisa?)

EL ENFOQUE DEL BUNDLER: He estado jugando con rbenv en lugar de RVM, pero no entiendo el flujo de trabajo tan claramente. En el README.md, Sam Stephenson escribe que "rbenv no ... administra gemas. Bundler es una mejor manera de administrar las dependencias de las aplicaciones". Hay un complemento rbenv-gemset) para obtener los mismos resultados que los gemas de rvm, pero Sam claramente prefiere usar Bundler en su lugar. Desafortunadamente, no explica cómo sería el flujo de trabajo. Incluso el Bundler sitio web no conecta explícitamente todos los puntos de cómo aislar un proyecto de otro. Varios blogs gists venga al rescate, sugiriendo lo siguiente~/.bundle/config archivo

---
BUNDLE_PATH: vendor/bundle

(Por cierto, no estoy seguro de qué se trata el "---". Los documentos no lo mencionan y no parece hacer una diferencia).

Esto efectivamente le da a cada proyecto de rieles su propio conjunto de gemas, almacenando las gemas en ProjectX / vendor / bundle /. De hecho, los rieles se (re) instalarán allí, lo que hará que el proyecto sea completamente independiente del resto de mi entorno, una vez que ejecutebundle install.

Pero elelefante en el cuart es el problema del huevo y la gallina de crear la carpeta del proyecto rails en¡¡primer lugar! Para crear la carpeta ProjectA usando RailsA, necesito instalar rails (y sus numerosas dependencias)primer. Pero cuando quiero crear ProjectB, debo cambiar a usar RailsB. Sin gemas, debo hacer algunas mejoras / degradaciones serias. No es genial.

Una posible solución es simplemente no preocuparse por la versión de rieles que uso para crear la carpeta ProjectX. Si luego uso rails 3.0 para crear un proyecto 3.2, podría crear manualmente el árbol de aplicaciones / activos. Pero eso solo me molesta. ¿No hay una mejor manera?

Respuestas a la pregunta(6)

Su respuesta a la pregunta