Semantic Versioning & Pessimistic Version

  • por Natalia Muñoz

Alguna vez te has preguntado qué significan estos números y símbolos.

Cada vez que agregamos una nueva gema al gemfile lo que la mayoría de nosotros hacemos es copiar y pegar una línea como esta en nuestro gemfile.

gem 'to_xls', '~> 1.5.3'

En este post te enseñaremos qué significan estos números y símbolos, y por qué es importante que lo tengas en cuenta cada vez que agregues una nueva gema a tu proyecto.

Semantic Versioning

Semantic Versioning es una guía que nos permite establecer un orden al momento de lanzar nuevas actualizaciones y mejoras en nuestras gemas.

En la actualización que se produce en una gema, se pueden identificar tres tipos:

  • 0.0.x significa que se ha corregido un bug en la gema, y que la solución es retrocompatible con versiones anteriores de nuestro código. Generalmente nos encontramos con que el autor ha corregido un problema de seguridad o algún caso borde a pedido de la comunidad.
  • 0.x.0 es que a la gema se le agregan nuevas funcionalidades y estas son retrocompatibles con la versión actual. Esta tiene nuevos métodos y clases, así como también avisos del autor que nos indican que en cierta versión el método será deprecado (es decir se dejara de usar).
  • x.0.0 significa que la actualización no es compatible con las versiones anteriores de nuestro código y lo mas probable es que los métodos y clases que utilizabamos ya no funcionen o que el resultado sea distinto del esperado.

Además de saber identificar qué significan las versiones de las gemas, es necesario saber cómo fijar la gema que necesitamos para nuestro código.

Pessimistic Version Constraint

Supongamos que necesitamos una gema para exportar archivos excel. El primer acercamiento sería escribir en nuestro gemfile lo siguiente:

gem 'to_xls'

Lo que sucede cada vez que hacemos “bundle install” es que bundler irá a buscar la última versión disponible de “to_xls” a rubygems. Ahora, según lo visto anteriormente, esto no es una buena idea, ya que nuestra gema puede pasar de la versión 0.0.3 a 1.5.3 y lo mas probable es que nuestro exportador de excel deje de funcionar.

Para prevenir estos problemas es que se pueden fijar versiones de las gemas que se instalan, para lo cual te mostraremos las dos nomenclaturas utilizadas:

Optimistic Versioning   >=

Volviendo a nuestro exportador de excel:

gem 'to_xls', '>= 0.0.3'

Esto significa que todas las versiones desde la 0.0.3 hasta la 1.5.3 son compatibles con nuestro código, lo que no es necesariamente verdad como ya aprendimos anteriormente.

Pessimistic Versioning ~>

Con el exportador de excel como ejemplo nos quedará de la siguiente manera:

gem 'to_xls', '~> 1.5.3'

Esto significa que nuestra gema recibirá todas las actualizaciones desde la 1.5.3 hasta 1.5…., sin pasar nunca a la versión 1.6.

En cambio si ponemos:

gem 'to_xls', '~> 1.5'

Significa que recibirá todas las actualizaciones desde las 1.5.0 hasta cualquier versión anterior a la 2.0.0


Es importante tener estas consideraciones al momento del desarrollo sobre todo cuando se pasa un proyecto a producción o cuando actualizamos el servidor de producción con una nueva version del sistema. Lo normal es que en este paso se haga nuevamente “bundle install” lo que traera como consecuencia la actualizacion de todas las gemas en el Gemfile.

Referencias

http://guides.rubygems.org/patterns/#pessimistic_version_constraint

http://www.knicklabs.com/my-rubygems-toolbox-part-1/

Imagen principal