Roll With IT

tamakiのIT日記

RubyMineを使ってgemを世界へ公開しよう!

このエントリーは、フィヨルドブートキャンプ Part 1 Advent Calendar 2022 の15日目の記事になります。Part2のはるまきさん記事はこちらです!

昨日のエントリーは、

でした!

はじめに

フィヨルドブートキャンプ32期生のtamakiと申します。

今回のテーマは、RubyMineを使ってgemを世界へ公開しよう! です!

gem開発のはじめの一歩のお役に立てれば幸いです。

対象読者

  • フィヨルドブートキャンプ生
  • gemの開発をしてみたい方
  • RubyMineを使ってgemを公開したい方

どんなgemを開発するの?

現在、gem開発を題材にしたプラクティスは発展編に移動されており必須ではありませんが、JavaScriptによる自作npmパッケージ開発を行うプラクティスが通常コースで用意されています。フィヨルドブートキャンプ生は、ここで自分の好きなnpmを開発しnpmパッケージサイトへアップロードし、世界へ公開するまでを行います。

個人的にこのプラクティスが凄く楽しくとても思い入れがあるため、今回はこのnpmを題材にgem版を開発していきたいと思います。

npmの紹介

まず先に開発したnpmを紹介したいと思います。

ところでみなさん、日々黒い画面を駆使しプログラミングを行うなかで、時には難解な問題が目の前で立ちふさがり前に進めなくなったことはないでしょうか?また黒い画面から離れても、人間関係、お金の問題、恋や夢、生きていく上でのさまざまな悩みを抱えたりしたことはないでしょうか?

そんな悩みにロックなアドバイスがもらえる!そんなnpmを開発してみました!

ぜひ!お使いのマシンへインストールしてもらい、黒い画面へ「yazawa」と入力してみましょう!きっとあなたの悩みはその瞬間から、YAZAWAのタオルのように宙に舞い消えていくことでしょう...!!

www.npmjs.com

Image from Gyazo

RubyMineを使ってgemを世界へ公開しよう!

環境

  • Ruby version: 3.1.2
  • Bundler version: 2.3.26

事前準備

bundlerをアップデート

開発に取り掛かる前に、bundlerをアップデートしておきましょう。

$ gem update bundler

ユーザー登録

RubyGems.orgにユーザ登録を済ませておくとよいでしょう。

gemの名前を決める

開発したgemを公開するにあたり、既存のgemと名前が被っていないか確認しましょう。今回は命名しようと考えていた名前「yazawa」がすでに登録されていたため、残念ですが「e_yazawa」として名前を付けることにしました。

gemの雛形を作成しよう

名前が決まったところで、まずはgemの雛形を作成しましょう。

RubyMineを立ち上げ、ホーム画面のNew Projectをクリックします。

以下の項目を選択し雛形を作成します。

すると、このようにgemの雛形を作成することができます。

❯ tree
.
├── CODE_OF_CONDUCT.md
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── bin
│   ├── console
│   └── setup
├── e_yazawa.gemspec
├── lib
│   ├── e_yazawa
│   │   └── version.rb
│   └── e_yazawa.rb
├── sig
│   └── e_yazawa.rbs
└── spec
    ├── e_yazawa_spec.rb
    └── spec_helper.rb

5 directories, 13 files

gemのソースコードGitHubと共有しよう

後ほどGitHubリポジトリのURLが必要になるので先に共有を行います。

メインメニューから、Git > GitHub > Share Project On GitHub を選択します。

これで共有は完了です。

GitHubへアクセスし無事共有されているか確認してみましょう。

gemspecを編集しよう

コードを書いていく前にまずgemspecの編集が必要です。こちらを編集しないとbuildができず、またGitHubにpushもできないため事前に行います。

必須項目は、TODOと書いてある箇所になります。

  • summary : gem の要約
  • description : gem の説明
  • homepage : gem のホームページの URL。今はGitHubのURLを貼り付けておきます。RubyGemsへ公開後に差し替えます。
  • metadata["allowed_push_host"]: RubyGemsに公開したくない場合に設定する項目です。今回は公開するので削除しておきます。
  • metadata["source_code_uri"] : gem のソースコード URIGitHubリポジトリURLを貼り付けます。
  • metadata["changelog_uri"] : CHANGELOG.mdのURLを書く項目ですが、今回は用意していないのでGitHubリポジトリURLを貼り付けておきます。

bundle installを実行しよう

今回のgem開発では、tty-promptという便利なgemを利用したいと思います。Gemfileに追記し、雛形で用意されているgemと併せてインスールを実行します。

# frozen_string_literal: true

source "https://rubygems.org"

# Specify your gem's dependencies in e_yazawa.gemspec
gemspec

gem "rake", "~> 13.0"

gem "rspec", "~> 3.0"

gem "tty-prompt"
$ bundle install

gem開発においてGemfile.lockをコミットするかどうか

bundle install 実行後、Gemfile.lockが生成されます。Gemfile.lockについては、コミットするかどうか議論の対象となっているようですが、今回のgem開発においてはコミットしない立場を選択したいと思います。.gitignoreへ追記しておきます。

参考

メイン機能を実装しよう

メソッドで使用するデータは、別ファイルで用意しておきました。

├── lib
│   ├── database.rb
│   ├── e_yazawa
│   │   └── version.rb
│   └── e_yazawa.rb

メソッドはこんな感じにしてみました。

# frozen_string_literal: true

require_relative "e_yazawa/version"
require "tty-prompt"
require_relative "./database"

module EYazawa
  class Error < StandardError; end

  def self.advise
    prompt = TTY::Prompt.new
    your_name = prompt.ask("ホワット ユア ネーム?")
    choices = Message.advise(your_name)
    question = "YAZAWAにアスクしたいことをセレクト!"
    answer = prompt.select(question, choices)
    puts answer
  end
end

実行コマンドを作成しよう

コマンドライン上で動かすには実行ファイルが必要になります。

exeディレクトリを準備し、その中に実行ファイルを作成します。

├── exe
│   └── e_yazawa
#!/usr/bin/env ruby

require 'e_yazawa'

EYazawa.advise

実行ファイルに権限を与えましょう。

$ chmod 755 exe/e_yazawa

$ ls -l
-rwxr-xr-x  1 username  staff  56 12 13 21:15 e_yazawa

実行してみよう

実行コマンド

$ bundle exec exe/e_yazawa

実行結果

Image from Gyazo

無事動きました!

buildしよう

gemspec ファイルを元にして Gem パッケージを作成します。buildすることでgemを使えるようにします。

メインメニューから、Tools > Gem > Build Gem を選択します。

/bin/zsh -c "bash -c 'env RBENV_VERSION=3.1.2 /usr/local/Cellar/rbenv/1.2.0/libexec/rbenv exec gem build e_yazawa.gemspec'"
  Successfully built RubyGem
  Name: e_yazawa
  Version: 0.1.0
  File: e_yazawa-0.1.0.gem

Process finished with exit code 0

e_yazawa-0.1.0.gemファイルが生成されます。

.gemファイルはGitで管理したくないので .gitignoreファイルに*.gemと追記しておきます。

公開しよう

メインメニューから、Tools > Gem > Push Gem を選択します。

実行ツールウィンドウに表示された指示に従い、EmailとPasswordを入力します。

RubyGemsへアクセスし公開されていることを確認してみましょう。

rubygems.org

バージョンアップ手順

追加機能を実装したり、バグ修正などを行った場合はバージョンアップしてRubyGemsを更新しましょう。手順は以下となります。

  • version.rbのバージョンを更新する
module EYazawa
  VERSION = "1.0.1"
end
  • 更新内容をcommitしGitHubへpushしておく
  • buildする Tools > Gem > Build Gem
  • RubyGemsへpushする Tools > Gem > Push Gem

参考

おわりに

最初は難しいかな?と思っていたgemの公開ですが、RubyMineを使うと一瞬で出来てしまいました。もちろん、コマンドライン上からも同じく実行できますので、気になった方はぜひお試しください!!

将来は誰かの役に立てるそんなgemを開発できるように日々精進してまいります!!

明日のアドベントカレンダーは?

せっかくなのでYAZAWAに聞いてみましょう!

Image from Gyazo

最後までお付き合いいただきありがとうございました!

それでは!メリークリスマス!!