はじめに
Bundlerを使ってRubyGemsを作成および公開する方法について説明します。Bundlerを使わずにRubyGemsを作成/公開する方法については以下の記事を参照してください。
rubygems.orgの登録
上記のページからrubygems.orgに登録します。後述する「RubyGemsの公開」セクションでここで登録したメールアドレスとパスワードが必要になります。
RubyGemsの作成
Bundlerの準備
以下のコマンドを実行してBundlerをインストールします。
% gem install bundler
インストールが完了したらバージョンを確認します。BundlerでRubyGemsを作成するには、Ver. 1.9.0以上が必要です。
% bundle -v
BundlerがVer. 1.9.0未満の場合、Bundlerのアップデートを行います。
% gem update bundler
テンプレート一式の作成
Bundlerを使ってRubyGemsに必要なディレクトリやファイルの一式を作成します。このとき、RubyGemsの名称を指定しますが、rubygems.orgに同名のRubyGemsが登録されていると作成したRubyGemsを公開することができません。そのため、希望する名称がrubygems.orgで使われていないか確認しておく必要があります。RubyGemsの検索を行うには以下のコマンドを実行します。今回は以下のようにgeister
と検索し同名のRubyGemsが登録されていないことがわかったので、geister
というRubyGemsを作成していくことにします。
% gem search geister
*** REMOTE GEMS ***
以下のコマンドを実行してテンプレート一式を作成します。
% bundle gem geister
上記のコマンドを実行すると、対話形式で以下の質問をされます。
- 自動テストの種類:
rspec
/minitest
/none
- MITライセンス (LICENSE.txt) を含めるか:
y
/n
- 行動規範 (CODE_OF_CONDUCT.md) を含めるか:
y
/n
MITライセンスと行動規範は、基本的にy
と回答していいと思います。
gemspecファイルの修正
gemspecファイルとはRubyGemsの仕様書を記述したファイルのことで、rubygems.orgはこのファイルに記載されている情報をRubyGemsの個別ページに表示します。
gemspecファイルを開き、「TODO」と書かれている箇所を修正します。
geister.gemspec
lib = File.expand_path("lib", __dir__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "geister/version"
Gem::Specification.new do |spec|
spec.name = "geister"
spec.version = Geister::VERSION
# 作成者の名前
spec.authors = ["Sakai Kotaro"]
# 作成者のメールアドレス
spec.email = ["info@autovice.jp"]
# RubyGemsのサマリー
spec.summary = "Geister"
# RubyGemsの説明
spec.description = "My first gem with bundler"
# RubyGemsのホームページ
spec.homepage = "https://github.com/whitia/geister"
spec.license = "MIT"
# 許可するホスト (https://rubygems.org)
spec.metadata["allowed_push_host"] = "https://rubygems.org"
spec.metadata["homepage_uri"] = spec.homepage
# RubyGemsのリポジトリーURI
spec.metadata["source_code_uri"] = "https://github.com/whitia/geister"
# CHANGELOGのURI
spec.metadata["changelog_uri"] = "https://github.com/whitia/geister/CHANGELOG.md"
# Specify which files should be added to the gem when it is released.
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
`git ls-files -z`.split("\x0").reject { |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", "~> 2.0"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_development_dependency "rspec", "~> 3.0"
end
修正が完了したら、依存Gemをインストールします。
% bundle install
コードファイルの修正
コードファイルに処理を記述していきます。
lib/geister.rb
require "geister/version"
module Geister
class Geister
def self.show
"~(m´ρ`)m"
end
end
end
自動テストの修正
作成した処理の自動テストを記述していきます。
spec/geister_spec.rb
RSpec.describe Geister do
it "has a version number" do
expect(Geister::VERSION).not_to be nil
end
it "show ghost emoji" do
expect(Geister::Geister.show).to eq("~(m´ρ`)m")
end
end
自動テストを記述したら、テストが通ることを確認します。
% bundle exec rspec spec
Geister
has a version number
show ghost emoji
Finished in 0.0022 seconds (files took 0.11771 seconds to load)
2 examples, 0 failures
RubyGemsのビルド
RubyGemsのビルドを行います。
% rake build
geister 0.1.0 built to pkg/geister-0.1.0.gem.
RubyGemsのインストール
作成したRubyGemsのインストールを行います。
% gem install pkg/geister-0.1.0.gem
Successfully installed geister-0.1.0
Parsing documentation for geister-0.1.0
Installing ri documentation for geister-0.1.0
Done installing documentation for geister after 0 seconds
1 gem installed
動作確認
RubyGemsをインストールしたので、動作を確認してみます。
% irb
irb(main):001:0> require "geister"
=> true
irb(main):002:0> Geister::Geister.show
=> "~(m´ρ`)m"
RubyGemsの公開
作成したRubyGemsをrubygems.orgに公開してみましょう。
リポジトリーの準備
GitHubなどにRubyGemsのリポジトリーを作成します。作成できたら、リポジトリーへRubyGemsの一式を送信します。
# Gitの初期設定(設定済みなら不要)
% git config --global user.name YOUR_NAME
% git config --global user.email YOUR_EMAIL
# リモートリポジトリーの設定
% git remote add origin https://github.com/YOUR_NAME/YOUR_REPOGITORY.git
# リモートリポジトリーへ送信
% git add .
% git commit -m "First commit"
% git push --set-upstream origin master
rubygems.orgにアップロード
すべての準備が整ったので、rubygems.orgにアップロードします。
% rake release
geister 0.1.0 built to pkg/geister-0.1.0.gem.
Tagged v0.1.0.
Pushed git commits and tags.
Pushing gem to https://rubygems.org...
Successfully registered gem: geister (0.1.0)
Pushed geister 0.1.0 to https://rubygems.org
おめでとうございます。これであなたの作成したRubyGemsは全世界に公開されました。
% gem search geister
*** REMOTE GEMS ***
geister (0.1.0)
まとめ
Bundlerを使ってRubyGemsを作成して公開する方法について説明しました。Bundlerを使わずに作成することも可能ですが、ちゃんとしたRubyGemsを作成して公開するなら、自動テストやライセンス条項を記述したファイルなども必要になります。Bundlerを使えば必要なファイルのテンプレート一式を準備してくれるので、RubyGemsを作成する際のスタンダードとなっているようです。
本記事を参考にしていただければと思います。