Gemの作り方(入門編)

  • 94
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

まずどうやってひな形を作るか。ですがこれは bundle gem という、bundlerがデフォルトで提供しているコマンドを利用するのが一番簡単です。

今回はhello_worldという名前でgemを作るので、bundle gem hello_worldとします。

スクリーンショット 2015-07-11 22.41.04.png

実行すると、このような形でひな形が生成されます。これを使って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を公開したい場合はしっかりと書いておきましょう!とくに descriptionsummaryこの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だけでは難しくなってきます。その時に初めて テスト というものが重要になってきます。が、この話はまた次回で!