JQ Blog

Gemの作り方

Gemとは

言語によってそれぞれ使用しやすい方式で作ったものを提供させています。それをライブラリ、またはフレームワークといいます。RailsがフレームワークだとしたらGemはライブラリです。つまり、必要な機能がある場合追加して使用したら良いです。
基本的にオープンソースとしてディストリビューションされていて、誰でも検索し、使用法を調べて使用したら良いです。

例え

devise

会員登録やログインシステムのためによく使われるGemのdeviseを例に取ってみます。
まず、https://rubygems.orgでdeviseを検索してみると、

上記のように色んなバージョンにできています。その中で自分がインストールしたいバージョンを選んでインストールしたら良いです。
次はgithubで検索してみると、


全てのGemはこのようにソースコードと使い方を公開しています。

 作り方

さて、本格的にGemの作り方を見てみましょう。
Gemの作り方は以外と簡単です。

bundle gem 「Gem名」

こういうふうにすると下のように作成ができます。

作成が終わったらディレクトリの中にlibフォルダーが確認できます。

この場合、hello_system_team.rbが本体になり、このGemをrequireすると、最初にこのファイルが呼ばれ、次にこのファイルでrequireしているものが呼ばれるという形になります。
version.rbは単純にGemのバージョン管理に必要なファイルです。
まず、hello_system_team.rbをみると、

require “hello_system_team/version”
 
module HelloSystemTeam
  # Your code goes here…
end
 
こうなっていますが
def self.exec
  puts “Hello System-Team!”
end
moduleの中にこれを入れます。上記のメソッドは例えなので実際に実行したいメソッドを入れたら良いです。 後はディレクトリの中にあるhello_system_team.gemspecの設定を変更します。
# coding: utf-8
lib = File.expand_path(‘../lib’FILE)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require ‘hello_system_team/version’
 
Gem::Specification.new do |spec|
  spec.name          = “hello_system_team”
  spec.version       = HelloSystemTeam::VERSION
  spec.authors       = [“jo”]
  spec.email         = [fantasticjyc@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.”
  spec.license       = “MIT”
 
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the ‘allowed_push_host’
  # to allow pushing to a single host or delete this section to allow pushing 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&nbsp;ls<span style="color:#0086b3"></span><span style="color:#ff3399">-</span>files&nbsp;<span style="color:#0086b3"></span><span style="color:#ff3399">-</span>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.12”
  spec.add_development_dependency “rake”“~> 10.0”
  spec.add_development_dependency “rspec”“~> 3.0”
end
 
正しく変更できない場合はエラーが出てきます。僕の場合はsummary, description, homepage, metadataでエラーが出てきました。(泣)

そこまでできると、実行してみましょう。irbで実行してみたら下のようにうまくできます。
でも、複雑なGemになってくるとirbだけでは難しくなってきますのでその時ちゃんとテストを行うのが良いです。


無事にテストまでできればBuildとPushをします。


そして、Gemを検索してみると出てきますね!

他のプロジェクトでこのGemをインストールしたらGemに入っているメソッドを使うことができます。

参照

http://qiita.com/takashi/items/672781ed1b6255303381