コンユウメモ @kon_yu

作ったガラクタとか、旅行とかの話

Gemを作ってRubygemsに公開する手順

Railsでアプリを書いていたらこれって切り出せるんじゃないの?
他の人にも使ってより良くしたいし、あわよくば機能追加してもらいたい
そんな時はGemにして公開だ

と言うわけでGemを作ってRubygemsに登録したので作業手順をメモする

※調べたらちょっとずつ古い情報だったので2015年3月の最新版の手順を記載する

前提条件

  • Ruby 2.2.0
  • bundler 1.8.3
  • gem 2.4.5

Gemのひな形のジェネレート

生成のコマンド --testをつけることでrspecのひな形も作ってくれる

> bundle gem your_gem_name --test
create  your_gem_name/Gemfile
create  your_gem_name/Rakefile
create  your_gem_name/LICENSE.txt
create  your_gem_name/README.md
create  your_gem_name/.gitignore
create  your_gem_name/your_gem_name.gemspec
create  your_gem_name/lib/your_gem_name.rb
create  your_gem_name/lib/your_gem_name/version.rb
# your_gem_nameは作成するgemの名前

利用するgemの追加

テストで使うgem

RailsのGemfileと同じように書いてあげる

source 'https://rubygems.org'

gemspec

group :test do
  gem 'rspec'
  gem "pry-byebug"
end

# gem "httpclient" 依存性のあるGemをここに書くのは間違いなので注意

gemの依存関係を追加する

Railsでbundle install した後に、Gemfile.lockを見ると、Gemfileに書いていないライブラリがインストールされていることがわかる。 これが、そのGemfileで記載したgemに依存関係のあるgemだ。

gemの依存関係の追加方法はxxx.gemfilespecファイルのGem::Specificationで囲まれた中に追記してやる

ref: Specification Reference - RubyGems Guides

Gem::Specification.new do |spec|
 ・・・
 ・・
 ・
  spec.add_runtime_dependency 'httpclient', ">= 2.6" #gemfileの書き方とほぼ同じ
end

クラスを追加したい場合

lib/your_gem_name.rb

# 下記のようにgem名/xxxx.rbとクラスをおいたファイルを読んだほうがすっきりする
require "your_gem_name/backlog_api"

module YourGemName
  # Your code goes here...
end

Rspecを書く

これは普通に書いてOK、TDDで黄金の回転を生むのだ。

実行コマンドは、普通に

> bundle exec rspec

でOK

gemfilespecファイルの項目修正

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          = "your_gem_name"
  spec.version       = YourGemName::VERSION
  spec.authors       = ["kon_yu"]
  spec.email         = ["kon_yu@example.com"]
  spec.summary       = %q{TODO: Write a gem summary} 
  spec.description   = %q{TODO: Write a gem description}
  spec.homepage      = ""
  spec.license       = "MIT"
#  if spec.respond_to?(:metadata)
#    spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com' to #prevent pushes to rubygems.org, or delete to allow pushes to any server."
#  end


  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

TODOとが付いている項目などいかの項目を埋めればよいかと

  • spec.authors
  • spec.email
  • spec.summary
  • spec.description
  • spec.homepage
  • spec.license

spec.metadata['allowed_push_host'] について

以下の箇所

if spec.respond_to?(:metadata)
    spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com' to #prevent pushes to rubygems.org, or delete to allow pushes to any server."
  end

rubygemsに公開したくない場合は設定する必要がある
公開する場合は、削除する

README.mdを編集する

基本的にはTODOって書いてあるところを埋めてあげれば良い

README.mdファイル上の方にこのGemの概要を書いてあげる
TODO: Delete this and the text above, and describe your gem


## Usage
使い方を書いてやる
TODO: Write usage instructions here

Version番号指定する

lib/your_gem_name/vesrsion.rbのVERSIONを書き換える デフォルトでは0.1.0になっているので、最初はデフォルト値でいいと思う

module YourGemName
  VERSION = "0.1.0"
end

ビルドする

rake buildでよろしく作られ, pkdディレクトリ以下に作成される

> rake build
your_gem_name 0.1.0 built to pkg/your_gem_name-0.1.0.gem

RubyGemsに公開する

Rubygemsにアカウントを作る

Rubygemsにアカウントを作らないと公開できないので https://rubygems.org/sign_upからアカウントを作る

f:id:kon_yu:20150303134900p:plain

RubygemsAPIキーを取得する

プロフィールページのEdit画面からAPIキーを取得する https://rubygems.org/profile/edit

API ACCESSの項に、Curlコマンドがあるのでこれをコピペしてターミナルで実行する。

> curl -u kon_yu https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
# rubygemsのパスワードが求められるので入力する
Enter host password for user 'kon_yu':

# APIキーがコピーされたか確認
> cat ~/.gem/credentials
---
:rubygems_api_key: unkounkounkounkounkounkounkounkounko

リリース

rake releaseコマンドでよろしくrubygemsにデプロイされる

> rake release
your_gem_name 0.1.0 built to pkg/your_gem_name-0.1.0.gem.
Tag v0.1.0 has already been created.
Pushed your_gem_name 0.1.0 to rubygems.org.

確認

rubygemsのサイトにログインにプロフィールのページに自分の作ったgemがあればOK

参考: