酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

RubyGemはめっちゃ簡単に作れる!

RubyライブラリのRubyGemは知らないとハードル高そうに見えますが、実際にはかなり簡単につくれます。 これから積極的にRubyGemを作ってOSSの世界に貢献していきたいので簡単な作り方をまとめました。


準備

まずは準備のためにgemのアップデートと、bundlerのアップデートを行います。

1
2
3
4
5
6
7
8
# gem自信のアップデート
gem update --system

# bundler未インストールの場合はインストール
gem install bundler

# bundlerインストール済の場合はアップデート
gem update bundler

ひな形の作成

今回はtest_gemという名前のGemを制作していきます。

1
2
# test_gemのひな形を作成(Rspec付き)
bundle gem test_gem -t

ちなみに、Rails PluginのGemを作成する場合にはgem install railsをした上で以下のコマンドを実行します。

1
2
# test unitをスキップしたpluginの作成
rails plugin new test_gem2 -T --skip-test-unit --mountable

今回はbundle gem test_gemの方を説明していきます。Rails Pluginの詳細は以下のサイトに解説があります!

rails pluginコマンドで簡単に出来るgemの作成方法

作成されたファイルの概要

今回作成されたファイルの簡単な説明。

bundle gem test_gem -t
  create  test_gem/Gemfile
  create  test_gem/Rakefile
  create  test_gem/LICENSE.txt
  create  test_gem/README.md => このgemの説明や使い方を記述
  create  test_gem/.gitignore
  create  test_gem/test_gem.gemspec => このgemの説明や依存関係などを記述
  create  test_gem/lib/test_gem.rb => プログラムを記述
  create  test_gem/lib/test_gem/version.rb => このgemのバージョン情報を記述
  create  test_gem/.rspec
  create  test_gem/spec/spec_helper.rb
  create  test_gem/spec/test_gem_spec.rb
  create  test_gem/.travis.yml => travisを使う際の設定を記述

test_gem.gemspecの修正

test_gem.gemspecの中身は以下の様にになっています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'test_gem/version'

Gem::Specification.new do |spec|
  spec.name          = 'test_gem'
  spec.version       = TestGem::VERSION
  spec.authors       = ['morizyun']
  spec.email         = ['merii.ken@gmail.com']
  spec.summary       = %q{TODO: Write a gem summary}
  spec.description   = %q{TODO: Write a gem description}
  spec.homepage      = 'http://morizyun.github.io'
  spec.license       = 'MIT'

  spec.files         = `git ls-files -z`.split("\x0")
  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
  spec.require_paths = ['lib']

  spec.add_development_dependency 'bundler', '~> 1.7'
  spec.add_development_dependency 'rake', '~> 10.0'
  spec.add_development_dependency 'rspec'
end

最低限修正が必要な部分を抜き出すと以下のようになります。

# このgemの説明を書く
spec.summary       = %q{TODO: Write a gem summary}
spec.description   = %q{TODO: Write a gem description}

# このgemのHomepageを書く
spec.homepage      = 'http://morizyun.github.io'

# 依存するgemが存在する場合のみ、以下のように指定
spec.add_dependency 'xxxx', '~>x.x'

# 開発時だけに必要な依存gemが存在する場合のみ、以下のように指定
spec.add_development_dependency 'yyyy', '~>y.y'

Gemの実装

今回はテスト的にHello World!と出力するようにします。lib/test_gem.rbを開いて以下のように変更します。

1
2
3
4
5
6
7
require 'test_gem/version'

module TestGem
  def self.greet
    'Hello World!'
  end
end

実行してみよう

では先ほど作成したgemを実行してみます

1
2
3
4
5
6
7
8
9
10
# gem のインストール
bundle install

# rubyの対話型インタプリタを起動
bundle exec irb                                                                              [2.1.4]
irb(main):001:0> require 'test_gem'
=> true

irb(main):002:0> TestGem.greet
Hello World!

ということで無事実行できました!

RSpecを書こう

先ほどのTestGem.greetのテストをRSepcで書いていきます。spec/test_gem_spec.rbを以下のように変更します。

1
2
3
4
5
6
7
8
9
10
11
12
13
require 'spec_helper'

describe TestGem do
  it 'has a version number' do
    expect(TestGem::VERSION).not_to be nil
  end

  describe '#greet' do
    it 'returns "Hello World!"' do
      expect(TestGem.greet).to eq('Hello World!')
    end
  end
end

実行コマンドを追加

コンソール上でrun_test_gemというコマンドを使うとgemの内容を実行したい場合は 例えばbin/run_test_gemを作成して、以下のように書きます。

1
2
3
4
5
#!/usr/bin/env ruby

require 'test_gem'

puts TestGem.greet

Gem をパッケージ化します。

次にGemをパッケージ化します。コマンドとしては、gem build xxx.gemspecです。

1
2
3
4
5
6
7
8
9
10
11
12
gem build test_gem.gemspec
=> Successfully built RubyGem
=> Name: test_gem
=> Version: 0.0.1
=> File: test_gem-0.0.1.gem

gem install test_gem
=> Successfully installed test_gem-0.0.1
=> 1 gem installed

run_test_gem
=> "Hello World!"

Gem を公開する

GitHub』などのpublicなリポジトリを作成。

1
2
3
4
5
6
7
8
# まずはgit commit
git add . -A && git commit -m 'first commit'

# gitのリモートリポジトリを設定
git remote add origin git@github.com:morizyun/test_gem.git

# そして release
rake release

今回はすでに登録されているgemと名前がかぶっているので登録はできませんが、被らない名前にすればこれで公開できます。

今回のサンプルソース

今回のサンプルソースは以下のリポジトリにあります。良ければForkして試してみてください!

morizyun/test_gem - GitHub

Special Thanks

Gemの作り方まとめ 普通のgem編 - masarakki’s blog

君がOpsでもRubyで書いたライブラリはGemで配ろう

必要最小のgemの作り方とインストール - ザリガニが見ていた…。

おすすめの書籍