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として使えるようになります。
gem 'hoge', github: 'username/hoge'
Gemfileにこのように書くことで、RubyGemsではなくGithub上の指定のリポジトリを探してくれます。
RubyGems.orgでアカウント登録をしたりなどの手続きを踏まなくて良いので、意外とハードルは低いです。
補足:本番環境でも使用可能ですが、RubyGems.orgで公開する方法と比べてデメリット(バージョン管理が曖昧になる、キャッシュされないなど)もあるので、用途に応じて使い分けるのがおすすめです。
ざっくりとした流れ
- gemの雛形を作成
- gemの中身を作成・Spec(テスト)の追加
- gemspecの編集
- 動作確認
- README.mdの編集
- 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:
と書いてあります。
(例)
spec.summary = "TODO: Write a short summary, because RubyGems requires one."
何を書いたら良いかは以降に書いてあるので、それに従って書いていけば大丈夫です。
動作確認
$ gem build hoge.gemspec
このコマンドで.gem
ファイルが生成され、Gemとして利用可能になります。
gemspec
に記述漏れがあると警告されることもあるので、指摘を修正後に再度ビルドしてください。
Gemfile
からローカルのGemを読み込むには以下のように記述します。
gem 'hoge', path: '/path/to/hoge' # ローカルのgemのルートディレクトリのパスを指定
bundle install
を実行すればローカルのGemを利用できます。ただし、コード修正後は再度gem build
→ bundle 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での公開がおすすめです。
少し手間ですが、きっと思っているよりも簡単です。
まずはここで会員登録します。
ダッシュボード
→ 設定
→ 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はこちらで公開しています。
参考

株式会社ラグザイア(luxiar.com)の技術広報ブログです。 ラグザイアはRuby on RailsとC#に特化した町田の受託開発企業です。フルリモートでの開発を積極的に推進しており、全国からの参加を可能にしています。柔軟な働き方で最新のソフトウェアソリューションを提供します。
Discussion