💎

Gemを作って公開する(初心者向け)

に公開

こんにちは、またははじめまして、Tamaです。
株式会社ラグザイアでRubyエンジニア一年生をやっております。

先日案件の中で、Ruby on Railsアプリの中にある特定のクラス・機能をGemとして引き剥がす機会がありました。
Gemを作るのは初めてで、何から始めればいいのか分からず手探りの状態…。
色々調べながら進める中で、「これは初心者向けの情報として残しておくと役に立ちそう」と思ったので、備忘録を兼ねてまとめました。
この記事では、はじめてGemを作る人に向けて、できるだけ平易な言葉で手順やポイントを紹介します。

環境

Bundler 2.6.6
ruby 3.4.2

作る前の疑問・不安

Q. 作り方がそもそもわからない

A. Gemには雛形を作成するコマンドが存在しています。

$ bundle gem hoge

これを実行すると雛形が作成されるので、あとは必要な変更を行ったり、テストを追加したりするだけでgemが完成します。
この記事のほかにも「Gem 作り方」で検索すれば該当記事が出てきますし、chatGPTに聞けば教えてくれます。あまり身構えなくてもよいかと思います。

Q. 作ったgemを公開するための手続きがめんどくさそう

A. Github上にリポジトリさえ作ってしまえばgemとして使えるようになります。

Gemfile
gem 'hoge', github: 'username/hoge'

Gemfileにこのように書くことで、RubyGemsではなくGithub上の指定のリポジトリを探してくれます。
RubyGems.orgでアカウント登録をしたりなどの手続きを踏まなくて良いので、意外とハードルは低いです。

補足:本番環境でも使用可能ですが、RubyGems.orgで公開する方法と比べてデメリット(バージョン管理が曖昧になる、キャッシュされないなど)もあるので、用途に応じて使い分けるのがおすすめです。

ざっくりとした流れ

  1. gemの雛形を作成
  2. gemの中身を作成・Spec(テスト)の追加
  3. gemspecの編集
  4. 動作確認
  5. README.mdの編集
  6. Githubで公開

実際にGemを作る

gemの雛形を作成

ここではgemの名称はhogeとしています。適宜置き換えてください。

$ bundle gem hoge

任意のディレクトリで以上のコマンドを実行して、雛形を作成します。

注意:RubyGemsでの公開を検討している場合、同じ名前のgemがRubyGems上に存在していないか確認してください。同じ名前のgemが存在する場合、後々名前を変更する必要が出てきます。

初回のみCIやリント、テストフレームワークの設定について聞かれます。
定番のGithub Actionsやrubocop、RSpecなども選択可能です。ここで設定していれば、Githubにpushするだけでちゃんとリントやテストを実行してくれます。
ライセンスファイルを作成するか、変更履歴を残すかなどの確認もされます。こだわりがなければ、すべてyで良いです。

これでhogeというgemの雛形が作成されました。

gemの中身を作成・Spec(テスト)の追加

ロジックはlib/配下に記述します。lib/hoge.rbなどに機能を実装していきます。

補足:雛形作成時に lib/hoge/version.rb というファイルも生成され、ここでバージョン管理を行います。リリースに関係する重要なファイルです。
GitHub Actionsで自動リリースを設定する場合にも、このバージョン番号が重要になってきます。

雛形ではモジュールが定義されているだけなので、必要に応じてクラスやメソッドを追加していきます。

また、spec/以下にRSpecでテストコードも書いておくと、動作確認やCIの実装がスムーズです。

gemspecの編集

gemとして公開する時に必要なメタ的な情報はhoge.gemspecというファイルに集約されています。
編集が必要な項目には、TODO:と書いてあります。

(例)

hoge.gemspec
spec.summary = "TODO: Write a short summary, because RubyGems requires one."

何を書いたら良いかは以降に書いてあるので、それに従って書いていけば大丈夫です。

動作確認

$ gem build hoge.gemspec

このコマンドで.gemファイルが生成され、Gemとして利用可能になります。
gemspecに記述漏れがあると警告されることもあるので、指摘を修正後に再度ビルドしてください。

GemfileからローカルのGemを読み込むには以下のように記述します。

Gemfile
gem 'hoge', path: '/path/to/hoge' # ローカルのgemのルートディレクトリのパスを指定

bundle installを実行すればローカルのGemを利用できます。ただし、コード修正後は再度gem buildbundle installが必要です。

ちなみに、このコマンドを実行したときに生成された .gem拡張子のファイルはGithubにコミットしないようにしてください。 差分に含めると、gemspecに関するCIで落ちます。

README.mdの編集

gemの雛形を作成した際、同時にREADMEの雛形ができています。こちらにもTODO:で対応すべき箇所が示されているので、対応しましょう。
InstallationとUsageはしっかり書くと良いです。
Usageセクションには、Gemを使う人が一目で使い方を理解できるように、 簡単なコード例を1つ 入れておくのが良いかと思います。

例:

require 'hoge'

Hoge.hello # => "Hello from Hoge!"

Githubで公開

中身を作り終えたら、GitHubにpushすれば他のアプリケーションからもGemとして使えるようになります。

お疲れ様でした。

発展編

RubyGems.orgでgemを公開する

GitHubだけでの公開もできますが、より広く共有したい場合はRubyGems.orgでの公開がおすすめです。
少し手間ですが、きっと思っているよりも簡単です。

まずはここで会員登録します。
https://rubygems.org/sign_up

ダッシュボード設定APIキーと進みます。
パスワードを求められるので、入力します。

「新しいAPIキー」を押すと、APIキーを作成するために必要な情報を求められます。
名前は適当でも大丈夫ですが、push_keyなどわかりやすいものにしておきましょう。
ここで、スコープのrubygemをプッシュするには必ずチェックを入れてください。

「APIキーを作成」ボタンを押すと、APIキーが表示されます。この画面から離れると確認できなくなるので、忘れずに控えておきましょう。

次にターミナルに移り、gemのルートディレクトリで以下のコマンドを実行します。

$ export GEM_HOST_API_KEY=メモしていたAPIキー
$ gem push hoge-0.1.0.gem

補足: hoge-0.1.0.gem部分は、gemをビルドしてできた.gemファイルに差し替えてください。

エラーが出なければ成功です。RubyGems.org 上のプロフィールから確認できます。

お疲れ様でした。

最後に

調べたり、実際に作ったりしてみて、当初思っていたよりも簡単にGemを公開・使用できることがわかりました。
今回は案件の中で使用するGemを作ったのですが、次は他の方にも使ってもらえるようなGemを作ってみたいと思います。

この記事が、誰かの役に立てば幸いです。

私が実際に作ったGemはこちらで公開しています。
https://rubygems.org/gems/simple_inline_text_annotation

参考

https://guides.rubygems.org/make-your-own-gem/

https://bundler.io/guides/creating_gem.html

https://qiita.com/harashoo/items/1284fd5362c1a4f6c8a8

ラグザイア

Discussion