【Ruby】Bundlerを使ってRubyGemsを作成/公開する方法

はじめに

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を作成する際のスタンダードとなっているようです。

本記事を参考にしていただければと思います。

関連記事

【Rails】Railsアップグレードまとめ
# はじめに Ruby on Railsに限らず、何らかのフレームワークを使ってWebシステムを構築している場合、フレームワークのアップグレード作業は避けて通れません。 一般的にフレームワークはバージョン毎にEOL (End of Life [...]
2022年10月1日 14:32
【Rails】ユーザー登録時に行うメールアドレス認証機能の実装方法
# はじめに ユーザー登録/解除やログイン/ログアウトといった認証機能の導入に「devise」というGemを使っている人は多いと思います。「devise」では以下のように記述するだけで、ユーザー登録時に確認メールを送付しメールアドレス認証を行う機 [...]
2022年9月24日 14:24
【Rails】モデルに列挙型(enum)を定義し、使いこなす方法
# はじめに Railsはモデルでカラム名と同名の列挙型(enum)を定義することで、カラムと列挙型の変数を紐付けることができます。カラムと列挙型の変数を紐付けると、カラムに対して様々な便利な使い方ができるようになります。 本記事では、モデ [...]
2022年9月3日 10:29
【Rails】RailsでCORSとPreflight requestの設定を行う方法
# はじめに RailsアプリをAPIサーバーとして構築するには、CORS (Cross-Origin Resource Sharing)と Preflight requestの設定を行う必要があります。APIサーバーは外部からの要求に対して処理 [...]
2022年8月27日 10:44
【Ruby】RubyGemsを作成/公開する方法
# はじめに RubyGemsを作成および公開する方法について説明します。Bundlerを使ってRubyGemsを作成する方法については以下の記事を参照してください。 <iframe class="hatenablogcard" style [...]
2022年7月11日 21:52
【Rails】M1チップ搭載MacでRuby on Railsの開発環境構築
# はじめに M1チップ搭載MacにRuby on Railsの開発環境を構築する手順を記載します。 - MacBook Air (M1, 2020) - macOS Monterey 12.3.1 # Homebrew ## [...]
2022年5月5日 11:56
【Rails】Rakeタスクの基本情報と作成・実行方法
# はじめに Railsには標準でRakeというGemが同梱されています。RakeはRubyで実装されたMake(UNIX系のOSで使用できるコマンド)のようなビルド作業を自動化するツールです。Ruby Make、略してRakeというわけですね。 [...]
2022年3月7日 22:12
【Rails】モデルに外部キーを設定する方法とよく起こるエラー内容について
# はじめに Railsでモデルに外部キーを設定する方法について説明します。 # モデルに外部キーを設定する ## リレーションシップ 今回は1つのブログ記事は複数のコメントを持つ1対多のリレーションシップを例に説明します。現在は` [...]
2022年2月10日 14:18