- 更新日: 2017年3月16日
- Ruby
Gemの作り方(Ruby Gem)
Ruby で通常の gem を作る方法です。Bundler を使った Ruby Gem の作り方を解説します。Bundler を使うので、入ってなければ前もってインストールしておきます。
bundler のインストール。
1 2 3 |
$ gem install bundler |
— 環境 —
bundler 1.14.4
rake 12.0.0
Gem のテンプレートを生成
まずは、bundle gem コマンドで gem の雛形を生成します。–test オプションを付けると、spec が共に生成される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ bundle gem sample-mygem --test Creating gem 'sample-mygem'... MIT License enabled in config Code of conduct enabled in config create sample-mygem/Gemfile create sample-mygem/.gitignore create sample-mygem/lib/sample/mygem.rb create sample-mygem/lib/sample/mygem/version.rb create sample-mygem/sample-mygem.gemspec create sample-mygem/Rakefile create sample-mygem/README.md create sample-mygem/bin/console create sample-mygem/bin/setup create sample-mygem/.travis.yml create sample-mygem/.rspec create sample-mygem/spec/spec_helper.rb create sample-mygem/spec/sample/mygem_spec.rb create sample-mygem/LICENSE.txt create sample-mygem/CODE_OF_CONDUCT.md Initializing git repo in /path/to/sample-mygem |
sample-mygem とハイフン区切りの gem 名にした場合は、ハイフンが lib/sample/mygem.rb とディレクトリに分割されて lib 以下のファイルが生成されます。区切りなしや、_(アンダースコア)区切りの場合はディレクトリ分割されません。
依存する gem を gemspec ファイルに追記
gemspec ファイルは gem の仕様書となるファイルです。依存関係の仕様を明確にするために、このファイルにこれから作る gem が依存する gem を追記します。
sample-mygem.gemspec
1 2 3 4 5 |
Gem::Specification.new do |spec| # ... spec.add_dependency 'httpclient', '>= 2.6' spec.add_development_dependency 'rake', '~> 10.0' end |
開発環境にのみ必要な gem は add_development_dependency で追加する。依存する gem は、gemspec で解決されるので Gemfile には書かないようにしました。
続いて bundler で gem をインストール。vendor/bundle ディレクトリ以下にインストールします。
1 2 3 |
$ bundle install --path vendor/bundle |
.gitignore に vendor/bundle ディレクトリを追加しておく。
.gitignore
1 2 3 |
/vendor/bundle/ |
プライベートな gem で RubyGems(rubygems.org) に公開しない場合
RugyGems に公開しない場合は、gemspec の metadata[‘allowed_push_host’] に push するサーバーを設定します。
sample-mygem.gemspec
1 2 3 4 5 6 7 8 |
# 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) spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'" else raise "RubyGems 2.0 or newer is required to protect against " \ "public gem pushes." end |
RubyGems に公開する場合は、上記コード(if ~ else ~ end) を削除します。
gemspec の Author 情報等を編集
gemspec ファイルには、Author 情報(開発者)や gem の説明なども書きます。それらの情報を適切に編集する。最終的に sample-mygem.gemspec は以下のような内容になりました。
sample-mygem.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 25 26 |
# coding: utf-8 lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'sample/mygem/version' Gem::Specification.new do |spec| spec.name = "sample-mygem" spec.version = Sample::Mygem::VERSION spec.authors = ["author name"] spec.summary = 'summary' spec.description = 'description' spec.homepage = 'http://example.com' spec.license = "MIT" spec.files = `git ls-files -z`.split("\x0").reject do |f| f.match(%r{^(test|spec|features)/}) end spec.bindir = "exe" spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ["lib"] spec.add_development_dependency "bundler", "~> 1.14" spec.add_development_dependency "rake", "~> 10.0" end |
gemspec に TODO や FIXME などの単語が残っていると、gem 実行時にエラーとなるので修正する。GitHub に OSS として公開する場合は、homepage に GitHub のリポジトリ URL を指定すると良いです。
gem 本体の作成
続いて、gem 本体となる lib ディレクトリ以下のファイルを、Ruby コードで作成していきます。
lib/sample/mygem.rb
1 2 3 4 5 6 7 8 9 10 |
require "sample/mygem/version" module Sample module Mygem # Your code goes here... def self.greet puts 'Hello Rubygem !' end end end |
今回はサンプルなので、Hello Rubygem ! と挨拶を出力するだけの機能です。
実行可能なコマンドを作成
実行可能なコマンドは、bin ディレクトリ内に作って実行権を付与します。こちらもサンプルなので、hello とだけ出力するコマンドを作る例。
bin/hello
1 2 3 4 5 |
#!/usr/bin/env bash echo 'hello' |
1 2 3 |
$ chmod 755 bin/hello |
実行。
1 2 3 4 |
$ bin/hello hello |
バージョン番号の指定
lib/sample/mygem/version.rb
上記ファイルに、gem の version 番号を書いてアップデートしていきます。
README.md を作成
マークダウンで README を書く。オープンソースとして、GitHub に push して公開する場合は、README.md を分かりやすく書くと良いかと。私は英語で書くようにしています。
動作確認
ここまでできたら、作成した gem を読み込んだ状態でコンソールを起動して、gem 動作の確認を行ってみましょう。
1 2 3 4 5 6 |
$ bin/console irb(main):002:0> Sample::Mygem.greet Hello Rubygem ! => nil |
上手く動きました!
ビルドして RubyGems リポジトリに公開
RubyGems (rubygems.org) に公開する場合は、ビルドしてリリースします。まずは、ビルド。
1 2 3 |
$ bundle exec rake build |
続いて、RubyGems に公開するためのAPIキーを取得します。前もって rubygems.org のアカウントが必要です。
1 2 3 4 |
$ curl -u user_name https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials Enter host password for user 'user_name': |
user_name は、RubyGems(rubygems.org) のユーザー名を指定。パスワードが求められるので入力する。
APIキーを確認。
1 2 3 4 5 |
$ cat ~/.gem/credentials --- :rubygems_api_key: ***** |
最後に rubygems.org に公開します。
1 2 3 |
$ bundle exec rake release |
あとは、開発〜リポジトリにプッシュ(GitHub など)〜リリース(rubygems.org に公開)の繰り返しです。rubygems.org にリリース(アップデート)する際は、バージョン番号を上げないと弾かれるので、バージョン番号を適宜上げていきます。おつかれさまでした!
- – 参考リンク –
- Gemの作り方まとめ 普通のgem編 – masarakki’s blog
- RubyGemはめっちゃ簡単に作れる! – 酒と泪とRubyとRailsと
- Gemを作ってRubygemsに公開する手順 – コンユウメモ
- Gemの作り方(入門編) – Qiita
- 必要最小のgemの作り方とインストール – ザリガニが見ていた…。
- 【gemの作り方】 Rubyのオブジェクトをグンマー県が制圧するgem書いた – is Neet
- 書き捨てのRubyスクリプトをgemにするときの育て方の一例 – ククログ(2016-09-08)
- privateなrubygemsの誤リリースを防ぐ – Qiita
- Ruby の関連記事
- ローカル開発中のgemをGemfileに書いてインストール
- 熊本地震の余震が夜に多いのは本当か?Rubyプログラムで検証してみた
- El Capitanでgemのnative extensionビルド失敗に対応
- Rubyで親クラスから子クラスの定数を参照
- MacabをRubyで使う
- rbenv/ruby-buildでRuby最新バージョンをインストール
- Rubyでクラスインスタンス変数にインスタンスメソッドからアクセス
- 距離1kmあたりの緯度・経度の度数を計算(日本・北緯35度)
- Google Maps Geocoding APIで住所から緯度・経度を取得するRubyコード
- Yahoo地図API(YOLP)のジオコーダAPIで住所から緯度・経度を求めるRubyコード
Leave Your Message!