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からアカウントを作る
RubygemsのAPIキーを取得する
プロフィールページの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
作ったgemのページ https://rubygems.org/gems/your_gem_name