プログラミング初心者がgemを作って公開してみた(2015・5・23)


クソアツいgemを作ってエンジニアから多大なる賞賛を受けたいな〜とプログラミングをはじめてから思っていたので、とりあえず簡単なのを作ってみました。素晴らしいGemはまだ書けるレベルでは到底ないですし・・・

自分の事を書くと
・プログラミング歴2ヶ月
・書ける言語はRubyのみ。あとはHTMLの基礎的な部分

結論から先に申し上げると、こんなドドドド素人でもGemは作って公開できるってことです。

今回作ろうとしたのは 時計機能 のgemです。
sleepメソッドとDateTimeを知ったので、かねてから作ってみたかった時計をターミナル上で実現でき、これを応用して時計機能を付けられるgemを作ろうと考えました。
ビューである記述をすれば、時刻が1秒ごとに更新するイメージですね。(需要は間違いなく零ですが、今回はgemを作って公開するという目的のため、そこは無視でお願いします)

私の環境は
・Mac OS X 10.9.5 Marveriks
・Ruby 2.1.3
・Rails 4.2.1
こんなとこですか

以下のサイトを参考にさせていただきました!!
・「Ruby 初心者の新卒エンジニアが gem パッケージ公開に至るまで」
http://magazine.rubyist.net/?0046-RandexMultibyteGem
・「rails pluginコマンドで簡単に出来るgemの作成方法。」
http://qiita.com/camelmasa/items/44ceb6ea1a3c727bc567
・「RubyGemはめっちゃ簡単に作れる!」
http://morizyun.github.io/blog/ruby-gem-easy-publish-library-rails/

1:まずrails plugin コマンド

今回はrailsへのgemを作りたいのでrails pluginコマンドを使ってひな形を作成しました。
というかGemってrails pluginコマンドとbundle gemコマンドの二つの
作成方法があるらしく、『恐らく』rails plugin コマンドだとrails で使う用のGemが作成できる・・・はず・・・(だれか違い教えてください)

projectsとかのディレクトリで

rails plugin new Gem名 --mountable

をターミナルで実行するとファイルが生成されます。

どうやらgemには命名規則があるらしいのですが、基本小文字だと思っておけば変な事にはならなそうです。
参考サイトの一番上に紹介したるびまの記事に詳しく書かれています。というかその記事の読む方がこの記事読むより遥かに有益説が・・・

2:Githubで色々やる

今回はgithub経由でGemの公開を行ったので、Githubの自分のアカウントに新しいリポジトリを作成しました(筆者は基本SourceTreeを使って作業しました)。作成したリポジトリにひな形をそのままプッシュし、ひとまず終了。

3:ひな形の編集

Gem名.gemspecというファイルが必ずあるのでそこに詳細を記述していきます。
とりあえず TODO の summary と description の項目を埋めれば大丈夫かと。また、URLにはgithubのリポジトリのURLを張るのが良いのではないでしょうか。

Maintain your gem's version:
require "knockknock/version"

Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
  s.name        = "knockknock"
  s.version     = Knockknock::VERSION
  s.authors     = ["Phantom United"]
  s.email       = ["[email protected]"]
  s.homepage    = "https://github.com/ksuematsu/knockknock"
  s.summary     = "TNJC(This is Not Just a Clock)"
  s.description = "knockknock is a just GORGEOUS clock for ruby 2.1.3....no... just joke. please commit us and teach me how to make a great gem!!"
  s.license     = "MIT"
  s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"]
  s.test_files = Dir["test/**/*"]
  s.add_dependency "rails", "~> 4.2.1"
  s.add_development_dependency "sqlite3"
end

こんな感じに編集します。

作成する gem パッケージが既存の gem パッケージに依存する場合は add_dependency オプションを追加します。僕のgemは基本装備されているgemで事足りたので書きませんでした。

次にバージョンナンバーを定義します。
バージョンナンバーはgem名/version.rbに記載されています。
ここでは初期値として 0.0.1 と設定されているので特に手を付ける必要は無いでしょう。

具体的な実装

具体的な実装は lib/gem名.rb に記載していきます。require されるとこれが読み込まれるみたいです。

通常のモジュールやクラスを編集する要領でgemの機能の実装を進めます。でも筆者はモジュールとか編集した事無いんだよね・・・経験積もう

筆者のゴミ時計機能の実装の記述は以下のようなものに

require "knockknock/engine"
  require "active_support"
  module Knockknock
    def self.knock_clock
      DateTime.now
      puts dt
      sleep 1
      knock_clock
    end
end

永遠に1秒ごとの時刻を出力する時計ですね。(このあと致命的なミスがあることがわかるのですが・・・(ゴゴゴゴゴゴ))

公開

公開するにはまずRubyGems.orgに行ってアカウントを取得します。取得すると edit profile にAPIが載っているので
ターミナルで

curl -u ユーザid https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials

を実行し、APIのキーを取得します。これで準備万端。

全ての変更をプッシュしたあとに

bundle exec rake release

で公開完了です!
自分のrubygemページに行ってみると・・・

出来ました!!

自分のプロジェクトで自分の作ったgemをgemfileに追記しbundle すると・・・

インストールされているッ!!!!
すごいぃぃぃいいいいいい!!!

最後に

こんな感じで誰でもgemは公開できるというお話でした。

作ってみての感想は、時計機能というかなりささやかな機能の実装を試みたにも関わらず、思いのほかレベルが高く、使い物になっておりません・・・なぜか現在65ダウンロードされているので、なんとか修正したいです。
というように、軽い気持ちでつくってみても、責任感のようなものが生まれ、必死に勉強するのでGemを作成し公開するのは良いなと思いました。

一方で、テストといった概念が完全に欠落しており、二度と使い物にならないものは簡単に公開しては駄目だなとも感じております。
猛省ですね。
これからもがんばります!
というか早く修正します!!!

ちなみに私の今回作ったgem は

こちらにあります。
どうかプログラミング先輩方の先見をお貸しいただければ、誠に幸いです!

この記事がどなたかの助けになれば、それほど素晴らしい事はありません。ここまで読んでいただき、ありがとうございました。