gemとはなんじゃその②　初心者→中級者へのSTEP14/25

#gemとはなんじゃその②

##はじめに
[前回](https://qiita.com/kamohicokamo/items/ded4cad5be1778547640)の記事でgemの簡単なイメージが湧きました。簡単なgemの使い方も学びました。
じゃあ今回は自分で簡単なgemを作ってみましょう。

##環境
（今まで開発環境のこと書いてなかったです...ごめんなさい)
`Ruby 2.3.1`
`bundler 1.14.6`

##まずは雛形を作る
適当にディレクトリを作ってそこに作ってみます。`bundler`を使えば雛形をコマンド一つて作ってくれます。gemの名前は[こちら](http://guides.rubygems.org/name-your-gem/)を参考にしてください。今回は適当に`testgem`としてます。
<img width="1440" alt="スクリーンショット 2018-12-14 20.24.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/174526/52415071-5118-d6cb-92a1-c101ea89038f.png">
途中でtestではどの`gem`を使うか、MITは必要か、code of conductは必要か聞かれるので答えましょう。
testは`rspec`を用い、残りの二つは必要と答えました。MITとcode of conductはオープンソースライセンスと行動規範のことです。作ったgemを公開するなら必要かなと思います。

作成されたものは下記のとおりです。

```console
$ 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`を使うように記述されています。

```rb
  spec.add_development_dependency "rspec", "~> 3.0"
```
ではインストールしましょう。と思ったら、怒られた。

```console
$ 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なので適当に埋めました。下記の部分です。

```rb
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が作れればいいので、テストも簡単です。

```testgem_spec.rb
describe Testgem::Greeting do
  it "hello" do
    expect(Testgem::Greeting.greet).to eql("Hello!")
  end
end
```
コードは基本的にlib/testgem/配下に置いてそれをtestgem.rbで読み込む形にしましょう。

```lib/testgem/greeting.rb
module Testgem
  class Greeting
    def self.greet
      "hello"
    end
  end
end
```
簡単なこんにちわコードです。後は`testgem.rb`で読み込みさらに、その`testgem.rb`を`spec/testgem_spec.rb`で読み込むようにします。

```testgem.rb
require 'testgem/greeting'
```

```spec/testgem_spec.rb
require 'testgem'
```
これでプログラムを実行できます。早速テストしてみましょう。

```console
$ 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します

```console
$ rake build
gemの名前 0.1.1 built to pkg/testgem-0.1.1.gem.
```
リリースします。

```console
$ 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