RubyGems の作成・公開手順【Ruby 2.6】

今回 RubyGems にライブラリを公開しました。その作成・公開の手順をまとめます。

# 環境

* Ruby 2.6.4
* Bundler 2.2.6

# 手順

大まかな流れは「[【Ruby】gemの作り方から公開まで](https://qiita.com/9sako6/items/72994b8b1c00af4e61fe) :lgtm:」を参考にさせていただきました。こちらで非常に良くまとめられているので、以下では手順をザッと列挙していきます。

## 作成

### プロジェクトの準備

bundler の更新後、次のコマンドで gem の雛形を作成します。

```
bundle gem [YOUR_GEM_NAME] -t
```

自動生成のために設定を色々と聞かれます。

#### Test framework

```
Do you want to generate tests with your gem?
.
.
.
Enter a test framework. rspec/minitest/test-unit/(none): rspec
```

#### CI service

```
Do you want to set up continuous integration for your gem? Supported services:
.
.
.
Enter a CI service. github/travis/gitlab/circle/(none): circle
```

#### MIT license

```
Do you want to license your code permissively under the MIT license?
.
.
.
y/(n): y
```

#### Code of conduct

```
Do you want to include a code of conduct in gems you generate?
.
.
.
y/(n): y
```

#### rubocop

```
Do you want to add rubocop as a dependency for gems you generate?
.
.
.
y/(n): y
```

### gemspec の更新

gemspec の `TODO` を確認し、必要に応じて記載を更新します。

また、処理に必要な gem の依存関係を記載します。

```:gemspec
spec.add_dependency "[GEM_NAME]"
``` 

更新後、 `bundle install` します。

### GitHub の設定

#### .gitignore

`.gitignore` に `Gemfile.lock` を追加します。

```:.gitignore
Gemfile.lock
```

詳しいことは「[gem開発においてGemfile.lockをコミットするかどうか](https://qiita.com/9sako6/items/72994b8b1c00af4e61fe#%E8%BF%BD%E8%A8%98-2020-06-01-gem%E9%96%8B%E7%99%BA%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6gemfilelock%E3%82%92%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B) :lgtm:」をご参照ください。

#### master -> main

このバージョンだと、デフォルトのブランチ名が `master` ですが、今は `main` を使うべきだと思うのでブランチ名を修正します。

```
git add -A
git commit -m "initial commit"
git checkout -b main
git branch -D master
```
#### remote add

GitHub に新規リポジトリを作成し、作成中の gem プロジェクトとリンクさせます。

```
git remote add origin https://github.com/[YOUR_ID]/[YOUR_GEM_NAME].git
git branch -M main
git push -u origin main
```

#### Circle CI

Circle CI にログインし、デフォルトで作成されている `.circleci/config.yml` でセットアップを実行します。

#### ブランチ保護

GitHub のブランチ保護設定に main ブランチを追加しておきます。

参考：[Githubでブランチ保護設定した時の作業メモ](https://qiita.com/da-sugi/items/ba3cd83e64c689795c50) :lgtm:


### 処理の実装

`lib` 配下の `[YOUR_GEM_NAME].rb` に処理を書いていきます。

#### コンソール

挙動確認でコンソールを叩きたいときは、次のコマンドで irb を起動できます。

```
./bin/console
irb(main):001:0>
```

#### テスト & 静的解析

次のコマンドで `rspec` と `rubocop` （デフォルトのタスク）が実行されます。

```
bundle exec rake
```


## 公開

公開手順の公式ドキュメント：[こちら](https://guides.rubygems.org/publishing/)

### RubyGems.org アカウント作成

gem の公開には [RubyGems.org](https://rubygems.org/) のアカウントが必要です。

### rake build

アカウント作成後、以下のコマンドで公開に必要な `pkg/xxx.gem` ファイルをビルドします。

```
rake build
[YOUR_GEM_NAME] 0.1.0 built to pkg/[YOUR_GEM_NAME]-0.1.0.gem.
```

### gem push

次のコマンドで作成した `pkg/xxx.gem` ファイルをプッシュします。

```
gem push pkg/[YOUR_GEM_NAME]-0.1.0.gem
```

RubyGems.org のメールアドレスとパスワードを聞かれるので、それぞれ入力します。

```
Enter your RubyGems.org credentials.
Don't have an account yet? Create one at https://rubygems.org/sign_up
   Email:   xxxxx@example.com
Password: 

Signed in.
Pushing gem to https://rubygems.org...
Successfully registered gem: [YOUR_GEM_NAME] (0.1.0)
```

`Successfully registered` が表示されれば完了です :tada:


# References

- [PUBLISHING YOUR GEM - RubyGems.org](https://guides.rubygems.org/publishing/)
- [【Ruby】gemの作り方から公開まで](https://qiita.com/9sako6/items/72994b8b1c00af4e61fe)
- [Githubでブランチ保護設定した時の作業メモ](https://qiita.com/da-sugi/items/ba3cd83e64c689795c50)