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 |
# 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) else raise “RubyGems 2.0 or newer is required to protect against public gem pushes.” end spec.files = git ls<span style="color:#0086b3"></span><span style="color:#ff3399">-</span>files <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 |
そこまでできると、実行してみましょう。irbで実行してみたら下のようにうまくできます。
でも、複雑なGemになってくるとirbだけでは難しくなってきますのでその時ちゃんとテストを行うのが良いです。
無事にテストまでできればBuildとPushをします。
そして、Gemを検索してみると出てきますね!
他のプロジェクトでこのGemをインストールしたらGemに入っているメソッドを使うことができます。