Dependencias en Ruby

Imobach González Sosa

http://github.com/imobach

@imobachgs

RubyGems

Al principio

RubyGems (2004)

Sistema de gestión de paquetes que permite instalar aplicaciones y bibliotecas

¿Cómo funciona?

CLI

$ gem search rails

$ gem list

$ gem install --user-install nokogiri
Building native extensions.  This could take a while...

$ gem update rails

$ gem content rails

$ gem help

Un poco de código

require "rubygems" # No es necesario (sólo Ruby <= 1.8)
require "octokit"

gemspec

Gem::Specification.new do |spec|
  spec.add_development_dependency "bundler", "~> 1.0"
  spec.authors = ["Yehuda Katz", "José Valim"]
  spec.description = "Thor is a toolkit for building..."
  spec.email = "ruby-thor@googlegroups.com"
  spec.executables = %w[thor]
  spec.files = %w[.document thor.gemspec]
    + Dir['*.md', 'bin/*', 'lib/**/*.rb']
  spec.homepage = "http://whatisthor.com/"
  spec.licenses = %w[MIT]
  spec.name = "thor"
  spec.require_paths = %w[lib]
  spec.required_rubygems_version = ">= 1.3.5"
  spec.summary = spec.description
  spec.version = Thor::VERSION
end

Y entonces llegó Rails

Mayor complejidad

Soluciones

  1. Ruby Version Manager (2009)
    • Permite instalar varias versiones de Ruby a la vez
    • Añade el concepto de gemset
    • No resuelve el problema de las dependencias, pero reduce su impacto
    • Han seguido apareciendo alternativas: rbenv, chruby, etc.
  2. Bundler (2010)
    • Se centra en mejorar la gestión y resolución de dependencias
    • Asegura que se instalan exactamente las versiones necesarias

Bundler

Consistencia

Gemfile

gem "octokit"
gem "rspec"

Gemfile.lock

Especificación de dependencias

gem 'rails', '4.2.0'
gem 'pg', '>= 0.17', '<= 0.19'

gem 'responders', '~> 2.0'

Fuentes

Fuentes: ejemplos

gem "rails", github: "rails/rails"
gem "simple_form", github: "plataformatec/simple_form",
  tag: "v3.1.0.rc2"
gem "mi-gema", path: "/home/user/gems/mi-gema"

source "http://my-own-repo.lan" do
  gem "examples"
end

Grupos

# These gems are in the :default group
gem 'nokogiri'
gem 'sinatra'

gem 'wirble', group: :development

group :test do
  gem 'faker'
  gem 'rspec'
end

Instalación de dependencias

$ bundle install

$ bundle install --path vendor/bundle

$ bundle install --jobs 4

$ bundle install --without test development

Actualizaciones

$ bundle update

$ bundle update rails

Un poco de código

Manual

require "rubygems" # No es necesario (sólo Ruby <= 1.8)
require "bundler/setup"
require "octokit" # Declarada en el Gemfile

Automático

        require "rubygems"
require "bundler/setup"
Bundler.require(:default) # Carga todas las gemas declaradas

El futuro

La fusión

Preguntas

/