【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】Paranoiaを使用した論理削除(ソフトデリート)
# はじめに Paranoiaは、Railsアプリケーションで論理削除(ソフトデリート)を実現するためのGemです。 論理削除は、データベースのレコードを物理的に削除するのではなく、削除フラグを設定することで「削除済み」とみなす方法です。こ [...]
2024年7月20日 21:33
【Rails】activerecord-multi-tenantを使用したマルチテナントアプリケーションの作成
# はじめに マルチテナントアプリケーションでは、複数の顧客(テナント)が同じアプリケーションを利用するため、データの分離が必要です。 activerecord-multi-tenantは、このようなマルチテナント環境をサポートするための便 [...]
2024年7月18日 16:50
【Rails】RubyとRailsにおけるattr_reader, attr_writer, attr_accessorの概念と使用方法
# はじめに RubyとRailsの開発において、`attr_reader`,`attr_writer`,`attr_accessor`は非常に便利なメソッドです。これらは、クラス内でインスタンス変数に対するゲッターおよびセッターメソッドを簡単に [...]
2024年7月17日 18:11
【Rails】RubyとRailsにおけるyieldの概念と使用方法
# はじめに RubyとRailsにおける`yield`は、メソッドやテンプレートの中で動的にコードブロックを実行する能力を提供し、これによってコードの再利用性と拡張性が大幅に向上します。本記事では、RubyとRailsにおける`yield`の概 [...]
2024年7月17日 13:15
【Rails】AASMを使用してオブジェクトの状態遷移を効率的に管理
# はじめに Railsアプリケーションにおいて、オブジェクトの状態管理は重要な課題の一つです。AASM (Acts As State Machine) gemは、複雑な状態遷移を効率的に管理します。本記事では、AASMの基本的な使い方を解説して [...]
2024年7月16日 18:00
【Rails】RSpec + Swagger + rswagでアプリケーションのAPIをテストおよびドキュメント化する方法
# はじめに Railsアプリケーションの開発において、APIのテストとドキュメント化は重要な要素です。 RSpecはテストフレームワークとして広く利用されており、SwaggerはAPIの設計とドキュメント化を支援します。これらを統合するr [...]
2024年7月16日 14:27
【Rails】mailcatcherを使用して開発環境でメール送信をテストする方法
# はじめに mailcatcherは、開発環境でのメール送信をキャプチャするためのツールです。ローカルで送信されたメールをブラウザ上で簡単に確認できるようにします。mailcatcherをRailsアプリケーションで使用する方法について説明しま [...]
2024年7月15日 16:37
【Rails】impressionistを使用してページビューやクリック数を追跡する方法
# はじめに impressionist Gemを使用してRailsアプリケーションでページビューやクリック数を追跡する方法について説明します。 # 実装方法 ## impressionist Gemのインストール まず、impre [...]
2024年7月15日 14:18