---
# System prepended metadata

title: gemを作ろうの会

---

# gemを作ろうの会
## 初めに
好きなディレクトリを作るか作業ディレクトリに入ってください
私の場合は
`$ cd environment/kenchaso`

## gemのテンプレートを作成する
`$ bundle gem kirakira_name`
※この際ネームスペースをハイフンで区切るとgem内のディレクトリが分かれてしまうので注意
lib以下のディレクトリlib/kirakira/nameみたいになるので意図しなければアンダースコアを使った方が良いらしい

いろいろ聞かれると思うので都度答えていきましょう

> 初めてgemを作る場合、
> MIT Licenseを使用するかどうか
>  Code of Conductを含めるかどうか
> 聞かれます。今回はどちらもyesにしました。
> MIT Licenseとは：
> 要約すると、MIT Licenseとは次のようなライセンスである。
> このソフトウェアを誰でも無償で無制限に扱って良い。ただし、著作権表示および本許諾表示をソフトウェアのすべての> 複製または重要な部分に記載しなければならない。
> 作者または著作権者は、ソフトウェアに関してなんら責任を負わない。
>  [MIT License - Wikipedia](https://ja.wikipedia.org/wiki/MIT_License) より
> MIT Licenseのコードを利用する場合、利用者はその旨をコード内かその他のファイルに記載する必要があります。詳細は [こちら](https://qiita.com/lovee/items/484ae3fc038314a64ee2#mit-license) を参考にしてください。
> Code of Conductについては [こちら](https://qiita.com/nstoym/items/ca711287117074a810aa) を参考にしてください。
[【Ruby】gemの作り方から公開まで - Qiita](https://qiita.com/9sako6/items/72994b8b1c00af4e61fe#1-%E9%9B%9B%E5%BD%A2%E3%82%92%E4%BD%9C%E3%82%8B)

## git commitしとこう
`$ git add .`
`$ git commit -m"first commit"`

## gem_name.gemspecを修正する
`kirakira_name.gemspec`の"TODO"というワードが含まれているところを修正する
※"TODO"というワードが含まれていると`bundle install`できない

```ruby
# frozen_string_literal: true

require_relative "lib/kirakira_name/version"

Gem::Specification.new do |spec|
  spec.name          = "kirakira_name"
  spec.version       = KirakiraName::VERSION
  spec.authors       = ["hogehoge"]
  spec.email         = ["hogehoge@example.com"]
  spec.summary       = "return kirakira_name"
  spec.description   = "KirakiraName.methods"
  spec.homepage      = "https://example.com"
  spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
  spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
  spec.metadata["homepage_uri"] = spec.homepage
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
    `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
  end
  spec.bindir        = "exe"
  spec.executables   = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
  spec.require_paths = ["lib"]
end
```

`$ bundle install`

## lib以下にコードを書いていく
### lib/kirakira_name.rb
```ruby
# frozen_string_literal: true

require_relative "kirakira_name/version"

module KirakiraName
  class Error < StandardError; end

  def self.random_one
    # でっかい配列からランダムに1個の配列を取得する
    [["一護", "いちご"], ["雨竜", "うりゅう"], ["泰虎", "やすとら"]].sample(1).flatten
  end
end
```

## 動作確認してみよう
`$ ./bin/console`

```
╭─○ ~/envirnment/kenchaso/kirakira_name ?(main)
╰─○ $ ./bin/console
irb(main):001:0> KirakiraName.random_one
=> ["雨竜", "うりゅう"]
irb(main):002:0> KirakiraName.random_one
=> ["泰虎", "やすとら"]
irb(main):003:0> KirakiraName.random_one
=> ["一護", "いちご"]
irb(main):004:0> KirakiraName.random_one
=> ["白哉", "びゃくや"]
irb(main):006:0> exit
```

## 配列をyaml形式のデータに置き換えてみる
上のコードみたいに配列でデータ取得するとデータ増えた時汚くなっちゃうのでyaml形式のファイルにデータを置き換えてみよう
lib以下にdataというディレクトリを作り、names.ymlというフォルダを作る
### lib/data/names.yml
```
- ["宝冠", "てぃあら"]
- ["紅多", "べーた"]
- ["出誕", "でるた"]
- ["晴空", "はるく"]
- ["瑠火", "るか"]
- ["俐亜武", "りあむ"]
- ["蓮", "れん"]
- ["彩華", "いろは"]
- ["心美", "ここみ"]
- ["蓮音", "れんおん"]
- ["愛紗", "あいしゃ"]
- ["衣音", "いおん"]
- ["登生", "とうい"]
- ["心音", "ここね"]
- ["弥安", "びあん"]
- ["湖々", "ここ"]
- ["玲夢", "りむ"]
- ["来蘭", "らら"]
- ["亘利翔", "ぎりしゃ"]
- ["朱李埜", "とりの"]
- ["寿希也", "じゅきや"]
- ["寿以輝", "じゅいき"]
- ["仁花", "にか"]
- ["葉紐", "ぱにゅ"]
- ["光", "ちゃくら"]
- ["乃晏", "のあん"]
- ["陸離", "りくり"]
- ["添", "てん"]
- ["花鳥", "あとり"]
- ["希妃梛", "まひな"]
- ["伽羅", "きゃら"]
- ["澄海", "すかい"]
- ["詠斗", "えいと"]
- ["在波", "あるは"]
- ["米呂", "まいろ"]
- ["愛流", "あいる"]
- ["美勇士", "みゅうじ"]
- ["奈瑞菜", "なずな"]
- ["空太", "こうた"]
- ["桜深", "おうみ"]
- ["礼夢", "らいむ"]
- ["甲子園", "こうしえん"]
- ["友里亜", "ゆりあ"]
- ["紗音琉", "さとね"]
- ["陽菜", "ひな"]
- ["陸", "りく"]
- ["陽葵", "ひまり"]
- ["奏音", "そら"]
```

>  [YAML](http://www.yaml.org/start.html)  (YAML Ain’t Markup Language) とは、構造化されたデータを表現するためのフォーマットです。YAML は次のような用途に向いています。
> * 各種設定ファイル
> * データ保存用 (シリアライゼーション)
> * データ交換用フォーマット
> * ログファイル
> YAML の目的は XML と似ていますが、XML と比べて次のような利点があります (YAML と XML との詳しい比較はセクション『 [XML との比較](https://magazine.rubyist.net/articles/0009/0009-YAML.html#l13) 』をご覧ください)。
> * 読みやすい ―― YAML ではインデントを使ってデータの階層構造を表すため、人間にとって非常に読みやすいです。
> * 書きやすい ―― YAML では XML のような終了タグが必要ないので、人間にとって非常に書きやすいです。
> * わかりやすい ―― YAML ではデータを「配列」「ハッシュ」「スカラー (数値や文字列や真偽値)」だけで表すため、人間にとって非常に理解しやすく、またプログラミングも容易です。
[プログラマーのための YAML 入門 (初級編)](https://magazine.rubyist.net/articles/0009/0009-YAML.html)

以下今回用意したデータの`-`は配列を表すので多元配列になってます

```
[["紗音琉", "さとね"], ["陽菜", "ひな"], ["陸", "りく"], ["陽葵", "ひまり"]]
```
こんな感じ

yamlファイルを読み込むようにライブラリ読み込んだりパス書いたりします
```ruby
# frozen_string_literal: true

require_relative "kirakira_name/version"

# yaml形式のデータを読み込むためにライブラリを読み込み
require 'yaml'

module KirakiraName
  class Error < StandardError; end

  def self.randam_one
    # lib/data/names.ymlを読み込むように書き換え
    YAML.load_file(File.expand_path(File.join('..', 'data', 'names.yml'), __FILE__)).sample(1).flatten
  end
end
```
[library yaml (Ruby 3.0.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/library/yaml.html)

## 動作確認してみよう
`$ ./bin/console`

```
╭─○ ~/envirnment/kenchaso/kirakira_name ?(main)
╰─○ $ ./bin/console
irb(main):001:0> KirakiraName.random_one
=> ["陽菜", "ひな"]
irb(main):002:0> KirakiraName.random_one
=> ["光", "ちゃくら"]
irb(main):003:0> KirakiraName.random_one
=> ["在波", "あるは"]
irb(main):004:0> KirakiraName.random_one
=> ["彩華", "いろは"]
irb(main):005:0> exit
```

## git commitしとこう
`$ git add .`
`$ git commit -m"finish create gem"`

## ローカルに作ったgemをインストールしよう
- gemをビルドする
`$ bundle exec rake build`
- 出来たpkg/kirakira_name-0.1.0.gemっていうgemをローカルにインストールする
`gem install pkg/kirakira_name-0.1.0.gem`

```
╭─○ ~/envirnment/kenchaso/kirakira_name ?(main)
╰─○ $ bundle exec rake build
kirakira_name 0.1.0 built to pkg/kirakira_name-0.1.0.gem.
╭─○ ~/envirnment/kenchaso/kirakira_name ?(main)
╰─○ $ gem install pkg/kirakira_name-0.1.0.gem
Successfully installed kirakira_name-0.1.0
Parsing documentation for kirakira_name-0.1.0
Installing ri documentation for kirakira_name-0.1.0
Done installing documentation for kirakira_name after 0 seconds
1 gem installed
```
こんな感じ
これでgemが使えるようになった

ちなみに上の処理を１コマンドで出来る`$ bundle exec rake install`ってのもあります
```
$ bundle exec rake install 
=> kirakira_name 0.1.0 built to pkg/kirakira_name-0.1.0.gem.
=> kirakira_name (0.1.0) installed.
```

## irbを起動して遊んでみる
`$ irb`
```
╭─○ ~/envirnment/kenchaso/kirakira_name (main)
╰─○ $ irb
irb(main):001:0> require 'kirakira_name'
=> true
irb(main):002:0> KirakiraName.random_one
=> ["礼夢", "らいむ"]
irb(main):003:0> KirakiraName.random_one
=> ["玲夢", "りむ"]
irb(main):004:0> KirakiraName.random_one
=> ["仁花", "にか"]
irb(main):005:0> exit
```
こんな感じでランダムで名前が返ってきます

## gemをアンインストールしとこう
`$ gem uninstall kirakira_name`

```
╭─○ ~/envirnment/kenchaso/kirakira_name (main)
╰─○ $ gem uninstall kirakira_name
Successfully uninstalled kirakira_name-0.1.0
```

## 参考文献
[【Ruby】gemの作り方から公開まで - Qiita](https://qiita.com/9sako6/items/72994b8b1c00af4e61fe)
[Bundler: bundle gem](https://bundler.io/man/bundle-gem.1.html)

## 終わりに
今回はざっくりとgemの作り方がなんとなく分かればいいかなくらいのゆるい感じでやりました
ちゃんと作って公開したい時は参考文献に貼ったやつみたりしてやってみてください