Recientemente en una reunion con algunos devs alguien pregunto si alguno conocía la diferencia entre gems y engines. Me sorprendió mucho que solo algunos conocían la diferencia.

Entender la diferencia entre gems y engines es realmente importante, sobre todo cuando trabajas con monolitos.

Primeramente vamos a entender cada uno de los conceptos para identificar las propiedades que tiene cada uno de ellos.

Que es una gema (gem)?

En realidad una gema (gem) es una librería de ruby on rails. Una librería es un extracto de código que proporciona una serie de funcionalidades para integrar directamente en un proyecto.

Basicamente una gema (gem) es código puro de ruby.

Para que una gema (gem) sea realmente una gema necesita tener presente en su código los siguientes paquetes.

  • Gemspec
  • Lib (directorio)
  • Puedes ser empaquetada y publicada en rubygems
  • Puede ser usada en cualquier proyecto al agregarla directamente en el gemfile

Crear una gema solo que necesitas ejecutar el comando bundle gem my_gem y responder una serie de preguntas para crear el scaffold.

Después de haber creado el scaffold podrás identificar el archivo my_gem.gemspec y el directorio lib el cual contiene un archivo llamado my_gem.rb , con estos archivos tu podrás ejecutar el comando gem build my_gem.gemspec para empaquetar la gema y de esta forma poder publicarla en rubygems o instalarla localmente.

Que es un engine?

Un engine puede ser una gema y a la vez contener otras gemas en su código pero una NO todas las gemas son engines.

El engine son funcionalidades de ruby on rails, esto quiere decir que pueden contener models, controllers, views, migrations, etc.

Un Engine es básicamente una aplicación con la desventaja de no poder funcionar por si sola ya que requiere ser integrada en una aplicación de ruby on rails.

Para que un engine sea realmente una engine necesita tener presente en su código los siguientes paquetes.

  • Gemspec
  • models, controllers, views, migrations, initializers, etc.
  • Puedes ser empaquetada y publicada en rubygems
  • Puede ser usado solo en aplicaciones con Ruby on Rails.

Un engine puede ser creado ejecutando cualquiera de los siguientes comandos

  • rails plugin new my_engine --mountable
  • rails plugin new my_engine --full

Para empaquetar e instalar un engine puedes utilizar el mismo comando que se utiliza en las gemas (gems) gem build my_engine.gemspec

Diferencia entre Mountable y Full

Existen dos opciones para crear un engine, mountable y full.

Un mountable engine significa que será agregado dentro de una aplicación de Ruby on Rails en un path especifico como podría ser /my_engine el cual tendrá sus propios directorios para assets y controllers.

Full engine no esta destinado a ser agregado dentro de una aplicación Ruby on Rails, esto quiere decir que proporcionara nuevas entidades y funcionalidades a una aplicación existente. No se encapsulará y solo será una extensión de la aplicación principal.

Cómo podrás darte cuenta una gema (gem) son librerías de código puro mientras que un engine puede contener funciones de Ruby on Rails, sin embargo un engine se pueden empaquetar como una gema regular pero solo funcionará dentro de una aplicación Rails.

Si consideras que este aporte fue de valor compártelo para juntos crear un ambiente donde todos deseemos colaborar.