Make your own gem
From start to finish, show you how to package your Ruby code in a gem
First we’re going to create a simple gem called hello that generates a hello world
$ bundle gem hello
create hello/Gemfile
create hello/Rakefile
create hello/.gitignore
create hello/hello.gemspec
create hello/lib/hello.rb
create hello/lib/hello/version.rb
Initializating git repo in /Users/mert/....
we’ll walk you through some of the generated files, starting with the hello.gemspec file.
# -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
require "hello/version"
Gem::Specification.new do |s|
s.name = "hello"
s.version = Hello::VERSION
s.platform = Gem::Platform::RUBY
s.authors = ["TODO: Write your name"]
s.email = ["TODO: Write your email address"]
s.homepage = ""
s.summary = %q{TODO: Write a gem summary}
s.description = %q{TODO: Write a gem description}
s.rubyforge_project = "hello"
s.files = `git ls-files`.split("\n")
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
s.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f) }
s.require_paths = ["lib"]
end
We can see straight away by looking at the TODO items that this file is designed to be edited directly. Once we complete these items we’ll have a working Gemspec file.
Now we are going to modify our hello file.
require "hello/version"
require 'hello/translator'
module Hello
def self.hi(language = "english")
translator = Translator.new(language)
translator.hi
end
end
The Translator is now in lib/hello, which can easily be picked up with a require statement from lib/hello.rb. The code for the Translator:
class Hello::Translator
def initialize(language)
@language = language
end
def hi
case @language
when "spanish"
"hola mundo"
else
"hello world"
end
end
end
Now you can build a gem from it. Then you can install the generated gem locally to test it out.
$ gem build hello.gemspec
Successfully built RubyGem
Name: hello
Version: 0.0.1
File: hello-0.0.1.gem
$ gem install ./hello-0.0.0.gem
Successfully installed hello-0.0.1
1 gem installed
Of course, the smoke test isn’t over yet: the final step is to require the gem and use it:
$ irb
>>require 'hello'
=> true
>>Hello.hi
=>Hello world!
>>Hello.hi("spanish")
=>hola mundo
Bundler is a great solution for creating and managing gems.
Written by Mert AKSOY
Related protips
2 Responses
Also, bundler includes a Rakefile with gem tasks for building and releasing your newly created gem: https://github.com/bundler/bundler/blob/master/lib/bundler/gem_helper.rb#L47-L50
The code in the Rakefile generates three tasks.
1) building, installing and releasing the gem with convenience tags
2) A common workflow to call rake install when a gem is set up the way we want so that we can install it on our local machine and test it out fully
3) and rake release tag that release and publish the gem to RubyGems.