Bundler & Geminabox
fabio_pitino@symantec.com
Bundler
# installation
gem install bundler
# setup
bundle init
Gemfile
source 'https://rubygems.org'
# always looks for the newest version
gem 'nokogiri'
# specific version
gem 'rails', '3.0.0.beta3'
# specific range: >, >=, <, <=
gem 'rack', '>=1.0'
# considers any 1.1.* versions
gem 'thin', '~>1.1'
# when lib name differs from gem name
gem 'rack-cache', :require => 'rack/cache'
# install but don't require
gem 'rubocop', :require => false
# associate gem to group(s)
gem 'debugger', :group => [:development, :test]
group :test do
gem 'minitest'
end
Bundler commands
# install all gems in Gemfile
bundle install
# update all gems in Gemfile
bundle update
# update specific gem
bundle update minitest
Using the gems
# file: ~/proj/app.rb
require 'rubygems'
require 'bundler/setup'
Bundler.require(:default, :development)
# Bundler.require(:default, ENV['RAILS_ENV'].to_sym)
require 'gem-outside-gemfile'
Let's create a gem!
bundle gem greeting --test=minitest
Creating gem 'greeting'...
create greeting/Gemfile
create greeting/.gitignore
create greeting/lib/greeting.rb
create greeting/lib/greeting/version.rb
create greeting/greeting.gemspec
create greeting/Rakefile
create greeting/README.md
create greeting/bin/console
create greeting/bin/setup
create greeting/.travis.yml
create greeting/test/test_helper.rb
create greeting/test/greeting_test.rb
inside the gemspec
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'greeting/version'
Gem::Specification.new do |spec|
spec.name = "greeting"
spec.version = Greeting::VERSION
spec.authors = ["Fabio Pitino"]
spec.email = ["pitinofabio@gmail.com"]
spec.summary = %q{TODO: Write a short summary, because Rubygems requires one.}
spec.description = %q{TODO: Write a longer description or delete this line.}
spec.homepage = "TODO: Put your gem's website or public repo URL here."
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
# delete this section to allow pushing this gem to any host.
if spec.respond_to?(:metadata)
spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
else
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
end
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ["lib"]
spec.add_development_dependency "bundler", "~> 1.11"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_development_dependency "minitest", "~> 5.0"
end
publishing
# package the gem
gem build greeting.gemspec
# after registering to rubygems.org
# we can publish it
gem push greeting-0.1.0.gem
Geminabox
gem install geminabox
setup Geminabox
# file: ~/gemserver/config.ru
require "rubygems"
require "geminabox"
# specify the directory where to store the gems
Geminabox.data = "./data"
# set to true if want to store gems from rubygems.org
# when not found locally
Geminabox.rubygems_proxy = true
run Geminabox::Server
start gemserver
# start gemserver on port 9292
rackup
#=> Thin web server (v1.6.4 codename Gob Bluth)
#=> Maximum connections set to 1024
#=> Listening on localhost:9292, CTRL+C to stop
back to greeting.gemspec
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'greeting/version'
Gem::Specification.new do |spec|
spec.name = "greeting"
spec.version = Greeting::VERSION
spec.authors = ["Fabio Pitino"]
spec.email = ["pitinofabio@gmail.com"]
spec.summary = %q{Greeting fun gem.}
spec.description = %q{A test gem that says hello.}
spec.homepage = "http://greeting-gem.com"
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
# delete this section to allow pushing this gem to any host.
if spec.respond_to?(:metadata)
spec.metadata['allowed_push_host'] = "http://gems.company.com:9292"
else
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
end
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ["lib"]
spec.add_development_dependency "bundler", "~> 1.11"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_development_dependency "minitest", "~> 5.0"
end
publishing to Geminabox
# package the gem
gem build greeting.gemspec
# push to internal gemserver
gem inabox greeting-0.1.0.gem --host http://gems.company.com:9292
# or the standard 'gem push' command
gem push greeting-0.1.0.gem --host http://gems.company.com:9292
# NOTE: using 'gem push' still requires 'geminabox' to be
# installed on the build environment
Eat your own dog food!
# file: ~/greeting_project/Gemfile
source 'https://rubygems.org'
gem 'rest-client'
gem 'json'
source 'http://gems.company.com:9292' do
gem 'greeting', '0.1.0'
end
gem install greeting --source http://gems.company.com:9292
Bundler & Geminabox
By Fabio Pitino
Bundler & Geminabox
How to use Bundler and Gemfile for dependency management in a Ruby project. Create and deploy Gems to a private Gem server
- 1,150