gemとはなんじゃその②
はじめに
前回の記事でgemの簡単なイメージが湧きました。簡単なgemの使い方も学びました。
じゃあ今回は自分で簡単なgemを作ってみましょう。
環境
(今まで開発環境のこと書いてなかったです...ごめんなさい)
Ruby 2.3.1
bundler 1.14.6
まずは雛形を作る
適当にディレクトリを作ってそこに作ってみます。bundlerを使えば雛形をコマンド一つて作ってくれます。gemの名前はこちらを参考にしてください。今回は適当にtestgemとしてます。

途中でtestではどのgemを使うか、MITは必要か、code of conductは必要か聞かれるので答えましょう。
testはrspecを用い、残りの二つは必要と答えました。MITとcode of conductはオープンソースライセンスと行動規範のことです。作ったgemを公開するなら必要かなと思います。
作成されたものは下記のとおりです。
$ ls -a
.                  .git               .rspec             CODE_OF_CONDUCT.md 
LICENSE.txt        Rakefile           lib                testgem.gemspec
..                 .gitignore         .travis.yml        Gemfile  
README.md          bin                spec
git initも自動でやってくれるみたいですね。LICENSE.txt、CODE_OF_CONDUCT.mdは先ほど回答したもの。README.md仕様書も作成されます。前回説明したGemfileもあります。gemを作成する場合、gemの依存関係はgemspecというファイルに記載すべきだそうです。なのでこの段階でGemfileにはgemspecを読み込むように書いてあります。
libの中にはtestgem.rbとtestgem/version.rbが入ってます。
このtestgem.rbがgemのコードを定義する主なファイルです。
コード書いてく前に、テスト書いてこう
先のテストにどのgem使う?、に対してrspecと回答したのでgemspecに開発環境でrspecを使うように記述されています。
  spec.add_development_dependency "rspec", "~> 3.0"
ではインストールしましょう。と思ったら、怒られた。
$ bundle install
You have one or more invalid gemspecs that need to be fixed.
The gemspec at /Users/hicom.games/works/asobiba/gemtest/testgem/testgem.gemspec is not valid. Please fix this gemspec.
The validation error was '"FIXME" or "TODO" is not a description'
gemspecの必須記入項目が書かれてねえから書いてくれとのこと。
testなので適当に埋めました。下記の部分です。
Gem::Specification.new do |spec|
  spec.name          = "testgem"
  spec.version       = Testgem::VERSION
  spec.authors       = ["kamo"]
  spec.email         = ["kamo@gmail.com"]
  spec.summary       = %q{this gem is test. by kamo}
  spec.description   = %q{this gem is test. by kamo}
  spec.homepage      = ""
  spec.license       = "MIT"
# ~~~~~~~~~~~~~~~略~~~~~~~~~~~~~~~~~~~~~~
end
これでインストールできます。$ bundle installします。
インストールできたらテストを書きましょう。今回のtestgemではありきたりなHello!が出力されるサンプルgemが作れればいいので、テストも簡単です。
describe Testgem::Greeting do
  it "hello" do
    expect(Testgem::Greeting.greet).to eql("Hello!")
  end
end
コードは基本的にlib/testgem/配下に置いてそれをtestgem.rbで読み込む形にしましょう。
module Testgem
  class Greeting
    def self.greet
      "hello"
    end
  end
end
簡単なこんにちわコードです。後はtestgem.rbで読み込みさらに、そのtestgem.rbをspec/testgem_spec.rbで読み込むようにします。
require 'testgem/greeting'
require 'testgem'
これでプログラムを実行できます。早速テストしてみましょう。
$ bundle exec rspec spec
Testgem
  hello
Finished in 0.00368 seconds (files took 0.0998 seconds to load)
1 example, 0 failures
問題なしですね。
ビルドして公開してみる
今回公開するつもりなかったんでtestgemなんて名前つけたせいで、すでにあるgemと名前が被りリリースできませんでした。
以下、一応リリースの手順です。
まず作ったgemはgithubのリポジトリにあげといてください。
次に公開するためにRrubyGems.orgでアカウントを作り、https://rubygems.org/profile/edit でAPI keyを取得します。
下記のコマンドを叩いてログインします。
curl -u お名前 https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
gemをbuildします
$ rake build
gemの名前 0.1.1 built to pkg/testgem-0.1.1.gem.
リリースします。
$ rake release
これで完了。gem install gemの名前でインストールできます。
まとめ
いつか自作のgem作ってみたいですね。頑張ります。
参考にしたの
【Ruby】gemの作り方から公開まで
https://qiita.com/9sako6/items/72994b8b1c00af4e61fe
guides.rubygems.org
https://guides.rubygems.org/make-your-own-gem/
Developing a RubyGem using Bundler
https://bundler.io/v1.13/guides/creating_gem
gemspecとGemfileの役割をはっきりさせておく
http://sanemat.github.io/archives/langturn.com-translations-33/
Rubyの名前空間とレキシカルスコープについて簡潔に説明する。
https://qiita.com/Drumato/items/ec889d0c3b4b94c67120
gemに投稿してみた
https://qiita.com/siukaido/items/53571e507e2abe592a7f