← Volver a la lista de posts

Manejadores de versiones para Ruby

Un manejador de versiones para Ruby te permite instalar varias versiones de Ruby en tu máquina y cambiar entre versiones fácilmente.

Pero ¿para qué quisiéramos tener instaladas varias versiones de Ruby?

Existen dos razones. La primera es que, si tienes proyectos en producción, es una buena práctica utilizar la misma versión de Ruby en tu ambiente local. Por ejemplo, si uno de tus proyectos utiliza la versión 2.2.1 en producción y otro proyecto la 2.3.1, deberías poder cambiar entre esas dos versiones fácilmente en tu ambiente local dependiendo del proyecto en el que vayas a trabajar.

La segunda razón es poder probar diferentes versiones de Ruby sin necesidad de estar desinstalando y reinstalando versiones, por ejemplo para probar tus proyectos con otras versiones, o simplemente para jugar con las nuevas características de la última versión.

Existen dos manejadores de versiones que son muy populares y en los que nos vamos a enfocar en este post: RVM (Ruby Version Manager) y rbenv.

RVM

RVM fue el primer manejador de versiones de Ruby y es el que personalmente uso. Para instalarlo en Linux y MacOS sigue estas instrucciones (para Windows utiliza este otro enlace).

Los comandos principales de RVM son:

  • rvm list: lista todas las versiones de Ruby instaladas en tu máquina.
  • rvm install [version_de_ruby]: instala una nueva versión de Ruby. Por ejemplo:
    $ rvm install 2.3.1
  • rvm use [version_de_ruby]: utiliza la versión que especifiques de Ruby. Por ejemplo:
    $ rvm use 2.3.1

Para definir la versión por defecto que se carga cuando abres la línea de comandos ejecuta rvm use --default [version_de_ruby]. Por ejemplo, para usar y definir por defecto la versión 2.3.1 utiliza el siguiente comando:

$ rvm use --default 2.3.1

Veamos algunos de estos comandos en acción. Empecemos por rvm list que lista las versiones que están instaladas en nuestro sistema:

$ rvm list

   ruby-2.2.0 [ x86_64 ]
   ruby-2.2.1 [ x86_64 ]
 * ruby-2.3.0 [ x86_64 ]
=> ruby-2.3.1 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

En este caso tenemos 4 versiones de Ruby instaladas. La que estamos usando actualmente se identifica por el prefijo =>, en este caso la 2.3.1, y la que se utiliza por defecto se identifica por el prefijo *, en este caso la 2.3.0. Podemos verificar que la versión que estamos usando es efectivamente la 2.3.1:

$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]

Cambiemos ahora a la versión 2.2.1:

$ rvm use 2.2.1
Using /Users/germanescobar/.rvm/gems/ruby-2.2.1

$ ruby -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]


La ventaja de RVM es que trae todo incluido cuando lo instalas: el manejador de versiones, el instalador de nuevas versiones de Ruby y el administrador para grupos de gemas (un tema que veremos más adelante). Sin embargo, muchos argumentan que eso va en contra de la filosofía Unix, en donde cada programa debería hacer una sola cosa bien1.

rbenv

rbenv es otro manejador de versiones de Ruby y hoy es mucho más popular que RVM según The Ruby Toolbox.

rbenv es solo un manejador de versiones y utiliza una arquitectura basada en plugins para agregar más funcionalidad. Eso quiere decir que si quieres instalar una nueva versión de Ruby debes hacerlo manualmente o instalar primero un plugin de rbenv llamado ruby-build (solo debes instalarlo una única vez).

rbenv solo soporta Linux y MacOS y lo puedes instalar siguiendo las instrucciones en este enlace. Existe una versión para Windows pero realmente no sé qué tan fácil sea de instalar.

Los comandos principales de rbenv son:

  • rbenv versions: lista las versiones de Ruby instaladas en tu máquina.
  • rbenv version: muestra la versión de Ruby activa (la que se está usando actualmente).
  • rbenv shell [version]: utiliza la versión que especifiques de Ruby. Por ejemplo:
    $ rbenv shell 2.3.1
  • rbenv global [version]: define la versión por defecto. Por ejemplo:
    $ rbenv global 2.3.1
  • rbenv rehash: este comando se debe ejecutar cuando se instala una nueva versión de Ruby o alguna gema que incluya nuevos comandos para la consola.

Nota: Puedes encontrar todos los comandos con ejemplos en este enlace.

Para instalar una nueva versión de Ruby -después de haber instalado el plugin ruby-build- utiliza el comando rbenv install [version_de_ruby]. Por ejemplo:

$ rbenv install 2.2.0

La ventaja de rbenv es que es más liviano que RVM y que utiliza una forma diferente de manejar las versiones que, muchos argumentan, es mejor (aunque seguramente debatible).

Definir la versión de Ruby por proyecto

Una buena práctica es crear un archivo llamado .ruby-version en la raíz de cada uno de tus proyectos que defina la versión de Ruby que se debe usar para ese proyecto. De esa forma, cuando entres a esa carpeta, tanto RVM como rbenv van a utilizar la versión correcta sin necesidad de que tengas que hacer el cambio explícito.

Aunque el archivo solo contiene la versión que se debe usar y podrías crearlo manualmente, tanto RVM como rbenv tienen comandos que lo crean por ti:

$ rvm --ruby-version use 2.3.1
$ rbenv local 2.3.1

Puedes agregar este archivo a Git y de esa forma todos los integrantes de tu equipo van a utilizar la misma versión en sus ambientes de desarrollo local (si están utilizando algún manejador de versiones).

Grupos de gemas (gemsets)

Una funcionalidad que incluye RVM, y que rbenv argumenta que no se necesita (aunque se puede incluir con un plugin), es el manejo de los grupos de gemas (gemsets).

Las gemas son las librerías de Ruby. Una gema se instala con el comando gem install [nombre_de_la_gema]. Por ejemplo:

$ gem install rails

Ese comando instalaría la versión más reciente de Rails, si queremos otra versión lo podemos hacer con la opción -v. Por ejemplo:

$ gem install rails -v 4.2.7

Una buena práctica es aislar las gemas de tu proyecto para que no se generen conflictos con otras versiones de las mismas gemas. Para eso RVM nos permite crear gemsets. Los comandos que necesitas conocer son:

  • rvm gemset list: lista los gemsets para cada una de las versiones de Ruby que tengamos instaladas.
  • rvm gemset create [nombre_del_gemset]: crea un gemset con el nombre que definamos. Por ejemplo, el siguiente comando crea un gemset llamado rails4:
    $ rvm gemset create rails4
  • rvm gemset use [nombre_del_gemset]: utiliza un gemset. Por ejemplo:
    $ rvm gemset use rails4
  • rvm gemset delete [nombre_del_gemset]: elimina un gemset. Por ejemplo:
    $ rvm gemset delete rails4

Muchos argumentan, y estoy de acuerdo, en que Bundler es una mejor forma de aislar (y manejar) las gemas de nuestros proyectos y que ya no son necesarios los gemsets. De hecho Rails viene con Bundler incluido. Sin embargo, es bueno que sepas que los gemsets existen.

Conclusión

Tanto RVM como rbenv intentan solucionar el mismo problema y los dos ofrecen una funcionalidad muy similar. Sin embargo, si tuviera que elegir alguno de los dos continuaría con RVM aunque la Internets argumente lo contrario.

No importa cuál escojas, lo importante es que instales y comiences a utilizar alguno porque más adelante lo agradecerás.


  1. Existen otros argumentos en contra de RVM pero no son relevantes para efectos prácticos de este post. 

comments powered by Disqus