まっしろけっけ

めもてきなやーつ

はじめてのgem作成

gem パッケージの作り方をメモ

ファイルの生成

gem_testというパッケージ名のgemを作成
-tオプションでspecファイルも作成

$ bundle gem gem_test -t
      create  gem_test/Gemfile
      create  gem_test/Rakefile
      create  gem_test/LICENSE.txt
      create  gem_test/README.md
      create  gem_test/.gitignore
      create  gem_test/gem_test.gemspec
      create  gem_test/lib/gem_test.rb
      create  gem_test/lib/gem_test/version.rb
      create  gem_test/.rspec
      create  gem_test/spec/spec_helper.rb
      create  gem_test/spec/gem_test_spec.rb
      create  gem_test/.travis.yml
Initializating git repo in /home/vagrant/gem_test
gemspecファイル

<パッケージ名>.gemspecというファイルが生成されていると思います。

$ cd gem_test/
$ more gem_test.gemspec
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'gem_test/version'

Gem::Specification.new do |spec|
  spec.name          = "gem_test"
  spec.version       = GemTest::VERSION
  spec.authors       = ["TODO: Write your name"]
  spec.email         = ["TODO: Write your email address"]
  spec.description   = %q{TODO: Write a gem description}
  spec.summary       = %q{TODO: Write a gem summary}
  spec.homepage      = ""
  spec.license       = "MIT"

  spec.files         = `git ls-files`.split($/)
  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.3"
  spec.add_development_dependency "rake"
  spec.add_development_dependency "rspec"
end
各項目はこんな感じ
  • name (gemのpackage名)
  • version (gemのversion)
  • authors (開発者名)
  • email (連絡先)
  • description (詳細説明)
  • summary (1行の簡易説明)
  • homepage (関連URL)
  • license (gemの属するライセンス)
  • files (公開ファイル一覧)
  • executables (実行可能ファイル一覧)
  • test_files (テスト用ファイル一覧)
  • require_paths (実際のgemの処理を行うファイルのパス指定)
  • add_development_dependency(開発時に必要なgemリの指定)
gemで行う処理の記述

gem のメソッド等を書いていきます。

$ vi lib/gem_test.rb
require "gem_test/version"

module GemTest
+  def self.new_method # "call new_method"という文字列を返すだけのメソッド
+    "call new_method"
+  end
end
動作確認
$ bundle exec irb
irb(main):001:0> require 'gem_test'
=> true
irb(main):002:0> GemTest.new_method
=> "call new_method"

期待通りの動作をしてくれました。

テストを書く

テストの書き方は今後

$ vi spec/gem_test_spec.rb 
require 'spec_helper'

describe GemTest do
  it 'should have a version number' do
    expect(GemTest::VERSION).not_to be nil
  end

+  it 'do new_method' do
+   expect(GemTest.new_method).to eq("call new_method")
+  end
end

$ rspec

GemTest
  should have a version number
  do new_method

Finished in 0.0011 seconds
2 examples, 0 failures
ビルドする

とりあえずrake taskを確認してみる

$rake -T
rake build    # Build gem_test-0.0.1.gem into the pkg directory
rake install  # Build and install gem_test-0.0.1.gem into system gems
rake release  # Create tag v0.0.1 and build and push gem_test-0.0.1.gem to Rubygems
rake spec     # Run RSpec code examples

buildを使ってみる

$ rake build
rake aborted!
ERROR:  While executing gem ... (Gem::InvalidSpecificationException)
    "FIXME" or "TODO" is not an author

Tasks: TOP => build
(See full trace by running task with --trace)

gem_test.gemspecをちゃんと変更しろって怒られた
とりあえずTODOを消して再実行

$ rake build
gem_test 0.0.1 built to pkg/gem_test-0.0.1.gem.

pkgディレクトリにgem_test-0.0.1.gemが作成されました。

installする

gem packageを指定してinstallする

$ gem install -l pkg/gem_test-0.0.1.gem
Successfully installed gem_test-0.0.1
Parsing documentation for gem_test-0.0.1
Installing ri documentation for gem_test-0.0.1
1 gem installed

確認してみる

$ gem list gem_test
*** LOCAL GEMS ***

gem_test (0.0.1)

installできたー!

動作確認してみる

$ ruby -e "require 'gem_test'; p GemTest.new_method"
"call new_method"

うごいたー!

作成したgemを公開してみる

とりあえずpush

$ git add .
$ git commit -m "first commit"
$ git remote add origin https://github.com/shiro16/gem_test.git
$ git push -u origin master

こちらで登録を行ってください。
証明書を取得してrelease!

$ curl -u shiro16 https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials
$ chmod 0600 ~/.gem/credentials
$ rake release
Repushing of gem versions is not allowed.
Please use `gem yank` to remove bad gem releases.

同じ名前のgemを既に他の人が作っているようなので
登録出来ないって言われました。

gemのpackage名が被っていなければこちらで確認すると公開されているかと