Rubygems
Una gema (o Ruby gem) es la forma de distribuir las librerías / frameworks
- Una gema tiene un nombre, una versión y una plataforma. Ej: rake-10.3.2.gem
- Contiene código, documentación y la especificación (gemspec)
Las gemas son instaladas en el "gemset" global
Normalmente, este gemset global es $RUBY_HOME/lib/ruby/gems/2.1.0/gems/
Pueden instalarse varias versiones de la misma gema (incluso incompatibles!)
require 'rake' # *siempre* va a cargar la última versión de rake
Posible escenario
Tenemos instaladas las gemas a-1.0.0, a-2.0.0 y b-1.0.0, la cual depende de a-1.0.0
require 'a'
require 'b'
¿Qué pasa con esto?
¿Qué es?
- Provee un entorno consistente para proyectos Ruby
- Rastrea e instala gemas en las versiones especificadas
- "Bundler is an exit from dependency hell"
Instalación
$ gem install bundler
Iniciar un proyecto que use bundler
$ bundle init
Genera un archivo llamado Gemfile (también podemos crearlo manualmente!)
Gemfile
- Define las dependencias del proyecto
- Las gemas se pueden instalar desde Rubygems u otro Gemcutter
- También se pueden instalar desde un repositorio git o más fácil, desde GitHub
- Podemos definir grupos de gemas
Gemfile de ejemplo
# donde va a ir a buscar las gemas:
source 'https://rubygems.org'
gem 'hobbit' # si no especificamos versión, va a buscar la última
# o incluso podemos generar la gema desde un repositorio git:
# gem 'hobbit', github: 'patriciomacadden/hobbit'
# podemos especificar en que grupo (o entorno) cargar las gemas:
gem 'oktobertest', group: :test
Instalar las dependencias
$ bundle # o bundle install
Calcula un grafo de dependencias e instala todas las gemas en el $GEM_HOME
¡Pero esto no es todo!
- Es necesario que el proyecto cargue las gemas correctamente
2 alternativas
- Bundler.require
- bundler/setup
Bundler.require
require 'bundler'
# bundler carga *todas* las gemas especificadas en el Gemfile
Bundler.require
Bundler.require acepta argumentos, siendo estos los grupos de gemas
bundler/setup
require 'bundler/setup'
# bundler no carga las gemas especificadas en el Gemfile,
# hay que hacerlo explícitamente
require 'hobbit'
Nota: es más rápida (en términos de performance) esta forma!
gs
"recreates the absolutely minimal feature set for creating and using gemsets"
- Inicia un shell session y configura las variables GEM_HOME, GEM_PATH y PATH para que apunten a $PWD/.gs
- Configura la variable GS_NAME con el nombre del gemset actual
- NO instala ninguna gema
Instalación
$ gem install gs
Iniciar un gemset
$ gs init
Iniciar un subshell
$ gs
Todos los comandos posteriores (por ejemplo rake) usarán las gemas del gemset
dep
Basic dependency tracking
Instalación
$ gem install dep
Agregar una dependencia
$ dep add hobbit
Obtiene la última versión de la gema y la agrega al archivo .gems
Instalar dependencias
$ dep install
Instala todas las dependencias (las que no estén ya instaladas)
Eliminar una dependencia
$ dep rm hobbit
Elimina la gema del archivo .gems
Chequear dependencias
$ dep check