このエントリーは、フィヨルドブートキャンプ 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のタオルのように宙に舞い消えていくことでしょう...!!
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 のソースコード URI。GitHubのリポジトリ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
実行結果
無事動きました!
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を更新しましょう。手順は以下となります。
version.rb
のバージョンを更新する
module EYazawa VERSION = "1.0.1" end
参考
おわりに
最初は難しいかな?と思っていたgemの公開ですが、RubyMineを使うと一瞬で出来てしまいました。もちろん、コマンドライン上からも同じく実行できますので、気になった方はぜひお試しください!!
将来は誰かの役に立てるそんなgemを開発できるように日々精進してまいります!!
明日のアドベントカレンダーは?
せっかくなのでYAZAWAに聞いてみましょう!
最後までお付き合いいただきありがとうございました!
それでは!メリークリスマス!!