Ruby Gems y Bundler
## Objetivos de Aprendizaje
- Comprender la estructura de RubyGems
- Usar la herramienta de linea de comandos gem
- Gestionar dependencias con Bundler
- Crear y distribuir gems
## Vision General de RubyGems
RubyGems es el gestor de paquetes de Ruby. Las gems son librerias reutilizables distribuidas como paquetes.
### Buscar Gems
```bash
gem search rails # Buscar gems
gem list # Listar gems instaladas
gem info rails # Mostrar info de gem
```
### Instalar Gems
```bash
gem install nombre_gem
gem install nombre_gem --version '~> 2.0'
gem install rails --no-document # Omitir documentacion
```
### Usar Gems Instaladas
```ruby
require 'nombre_gem'
# O especificar version
gem 'rake', '~> 13.0'
require 'rake'
```
## Bundler
Bundler gestiona las dependencias de gems para proyectos Ruby.
### Gemfile
Crea un `Gemfile` en la raiz de tu proyecto:
```ruby
source 'https://rubygems.org'
# Especificar gem con version
gem 'rails', '~> 7.0'
# Gem sin version (usa la ultima)
gem 'puma'
# Gem con opciones
gem 'mysql2', '>= 0.4.4', '< 1.0'
# Repositorio Git
gem 'capistrano', git: 'https://github.com/capistrano/capistrano.git'
# Ruta local
gem 'mi_gem', path: '~/codigo/mi_gem'
# Grupos
group :development, :test do
gem 'rspec'
gem 'pry'
end
```
### Instalar Dependencias
```bash
bundle install
bundle install --jobs=4 # Instalacion paralela
bundle update # Actualizar todas las gems
```
### Gemfile.lock
Despues de `bundle install`, se crea `Gemfile.lock` con las versiones exactas:
```ruby
GEM
remote: https://rubygems.org/
specs:
rails (7.0.0)
actionmailbox (= 7.0.0)
...
rspec (3.10.0)
...
PLATFORMS
ruby
DEPENDENCIES
rails (~> 7.0)
rspec
BUNDLED WITH
2.3.0
```
### Usar Gems en el Codigo
```ruby
require 'bundler/setup'
# O dejar que Bundler configure automaticamente
require 'bundler'
Bundler.require
# En un script
require 'bundler/setup'
```
### Ejecutar Gems
```bash
bundle exec rspec
bundle exec rake db:migrate
bundle exec ruby script.rb
```
## Comandos de Bundler
```bash
bundle install # Instalar dependencias
bundle update # Actualizar gems
bundle exec CMD # Ejecutar comando en contexto de bundle
bundle list # Listar gems instaladas
bundle show GEM # Mostrar ruta de gem
bundle check # Verificar dependencias
bundle outdated # Verificar gems desactualizadas
bundle init # Crear nuevo Gemfile
```
## Crear una Gem
### Estructura
```text
mi_gem/
├── mi_gem.gemspec
├── lib/
│ └── mi_gem/
│ ├── version.rb
│ └── mi_gem.rb
├── spec/
│ └── mi_gem_spec.rb
└── README.md
```
### Archivo Gemspec
```ruby
Gem::Specification.new do |s|
s.name = 'mi_gem'
s.version = '1.0.0'
s.authors = ['Tu Nombre']
s.email = 'tu@email.com'
s.summary = 'Una gem de ejemplo'
s.description = 'Una descripcion mas larga'
s.homepage = 'https://github.com/tu/mi_gem'
s.license = 'MIT'
s.files = `git ls-files -z`.split("\x0")
s.require_paths = ['lib']
s.required_ruby_version = '>= 2.4'
s.add_dependency 'json'
s.add_development_dependency 'rspec', '~> 3.0'
end
```
### Archivo de Libreria Principal
```ruby
# lib/mi_gem.rb
require 'mi_gem/version'
module MiGem
class Error < StandardError; end
def self.saludar(nombre)
"Hola, #{nombre}!"
end
end
```
```ruby
# lib/mi_gem/version.rb
module MiGem
VERSION = '1.0.0'
end
```
### Construir e Instalar
```bash
gem build mi_gem.gemspec
gem install ./mi_gem-1.0.0.gem
gem push mi_gem-1.0.0.gem # Publicar en RubyGems.org
```
## Gems Comunes
### Frameworks Web
| Gem | Descripcion |
|-----|-------------|
| rails | Framework web full-stack |
| sinatra | Framework web ligero |
| rack | Interfaz de servidor web |
### Base de Datos
| Gem | Descripcion |
|-----|-------------|
| activerecord | ORM (parte de Rails) |
| sequel | ORM ligero |
| pg | Adaptador PostgreSQL |
### Pruebas
| Gem | Descripcion |
|-----|-------------|
| rspec | Framework BDD |
| minitest | Framework de pruebas unitarias |
| capybara | Pruebas de integracion |
| factory_bot | Fixtures de prueba |
### Utilidades
| Gem | Descripcion |
|-----|-------------|
| pry | REPL y depurador |
| bundler | Gestor de dependencias |
| rake | Automatizacion de tareas |
| faraday | Cliente HTTP |
## .gemspec vs Gemfile
| Aspecto | gemspec | Gemfile |
|---------|---------|---------|
| Proposito | Definicion del paquete | Gestion de dependencias |
| Usado por | gem build/install | bundle install |
| Versioning | En archivo | Archivo lock |
| Plataforma | gem install | bundle exec |
## Resumen
- RubyGems es el gestor de paquetes para Ruby
- `gem install` instala globalmente
- Bundler gestiona las dependencias del proyecto via Gemfile
- `bundle install` instala desde Gemfile
- `bundle exec` ejecuta comandos en contexto de bundle
- Gemspec define metadatos y dependencias de la gem
- `gem build` y `gem push` para publicar
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →