はじめに
まずどうやってひな形を作るか。ですがこれは bundle gem
という、bundlerがデフォルトで提供しているコマンドを利用するのが一番簡単です。
今回はhello_worldという名前でgemを作るので、bundle gem hello_world
とします。
実行すると、このような形でひな形が生成されます。これを使ってgemを開発していくことになります。
gemspec
Gemの作成でまず大事になるのが gemの名前.gemspec
というファイルです。例えば上記で生成したひな形だと
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'hello_world/version'
Gem::Specification.new do |spec|
spec.name = "hello_world"
spec.version = HelloWorld::VERSION
spec.authors = ["Takashi Nakagawa"]
spec.email = ["tak1240@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.10"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_development_dependency "rspec"
end
このような形になります。
Gemの作成では、Gemの基本的な情報をほぼ全て、この gemspec
に書いていくことになります。
この情報は、Gemを一般に公開する際、他人が見ることのできる情報として公開されるので、Gemを公開したい場合はしっかりと書いておきましょう!とくに description
やsummary
このgemはなんのためのgemなのか、を伝えるものなので特に大事です。
ディレクトリ構造
そして肝心のGem本体の実装は lib/
directoryの中にあります。
ディレクトリ構造はこのようになっており
── lib
├── hello_world
│ └── version.rb
└── hello_world.rb
この場合、hello_world.rb
が本体です。このGemをrequireすると、最初にこのファイルが呼ばれ、次にこのファイルでrequireしているものが呼ばれる、という形になります。
大きいGemになってくるとこのファイルにはほとんどrequire
文しか書かず、あとは hello_world/
ディレクトリ以下にそれぞれの機能に応じたファイルを作り、実装していくと良いと思います。
version.rbは最初から作られており、単にGemのバージョンを管理するだけのファイルになります。わざわざgemspecに書かずこちらに書いているのは、Gem使用者がgemspecからも、コード(プログラム側)からもバージョン情報を知れるようにするためです。
実装
さて、肝心の実装ですが、今回の課題では
HelloWorld.exec
を実行して、 Hello World!
と出力されればよかったですよね。なので今回はhello_world.rb
を
require "hello_world/version"
module HelloWorld
def self.exec
puts "Hello World!"
end
end
こうすればOKです!
動作確認
さて、このGemの動作確認をする方法ですが、実はひな形の中の、bin/
ディレクトリに console
というプログラムがあります。これをターミナルから実行すると、作成中のGemを読み込んだ状態でirbが起動します。
なので、 bin/console
を使いirbを起動したのち、
$ HelloWorld.exec
とやってみて、実行されるかどうかを確かめましょう!
もちろん、複雑なGemになってくるとirbだけでは難しくなってきます。その時に初めて テスト
というものが重要になってきます。が、この話はまた次回で!