Rubyのgemの作り方を学んでみた

## なぜやるか？

普段なんとなく必要なgemをinstallして使っているが
実際どうやって作られて公開されているかを知ってみたかった。

## どういうgemを作るか？

今回は、よくSQLのQuery文を忘れることが多いので
入力値から自動でSQL文を作成してくれるgemを作ってみようと思います。
名前は、「sql_craft」にします！

## 作ってみる

https://guides.rubygems.org/make-your-own-gem/ を参考に進めます。

まず、以下のようなディレクトリ構成にする必要があります。

```sh
$ tree
.
├── sql_craft.gemspec # gemspecは、gemの中身、作成者、バージョンを定義する。
└── lib
    └── sql_craft.rb # 実際のコードの中身

```

./lib/sql_craft.rb を 以下のように記述します。
とりあえず、入力値を元に
DATABASEのcreate文とdrop文を出力するプログラムを書いてみます。
```ruby
module SqlCraft
  # DB関係
  class Database
    def initialize(name)
      @name = name
    end

    def create
      "CREATE DATABASE #{@name}"
    end

    def drop
      "DROP DATABASE #{@name}"
    end
  end
end
```

動きは、irbでデバッグして確認できました。
![スクリーンショット 2024-10-14 21.51.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102739/99023d95-d26d-2b1e-e756-7b8ecabf5d48.png)

sql_craft.gemspec を以下のように記述します。
```ruby
Gem::Specification.new do |s|
  s.name        = "sql_craft"
  s.version     = "0.1.0" # プレリリース
  s.summary     = "A simple SQL query builder gem"
  s.description = "you can be easier to make sql queries!!"
  s.authors     = ["Rinmaru"]
  s.email       = "xxxxxxxxxxxxxxx"
  s.files       = ["lib/sql_craft.rb"]
  s.homepage    = "https://rubygems.org/gems/sql_craft"
  s.license     = "MIT"
end
```

ローカルにgemを作成するため以下を実行します。
```sh
$ gem build sql_craft.gemspec
```

すると... 以下のような警告文が出てきました。
```sh
WARNING:  make sure you specify the oldest ruby version constraint (like ">= 3.0") that you want your gem to support by setting the `required_ruby_version` gemspec attribute
WARNING:  See https://guides.rubygems.org/specification-reference/ for help
```
調べてみると、gemが動くRubyのversionを記述しろ？とのことですので
sql_craft.gemspecに以下の内容を記述します。
https://rubygems.org/gems/net-http gem のページ見ると書いてあるやつですね。
```
 s.required_ruby_version = ">= 3.0"
```

再度実行すると警告文が出ずに成功しました。
```
  Successfully built RubyGem
  Name: sql_craft
  Version: 0.1.0
  File: sql_craft-0.1.0.gem
```

インストールしてみました。
```
$ gem install ./sql_craft-0.1.0.gem
Successfully installed sql_craft-0.1.0
Parsing documentation for sql_craft-0.1.0
Installing ri documentation for sql_craft-0.1.0
Done installing documentation for sql_craft after 0 seconds
1 gem installed
```

自分がつくったgemが動くのはなんか気持ちが良いですね
![スクリーンショット 2024-10-14 22.08.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102739/b66a883d-31e7-489e-4e82-ae8237915336.png)

## 公開してみる

まずは、以下のリンクからアカウントを作ります。
https://rubygems.org/sign_up


以下を実行して、ターミナルでログインします。
```
$ curl -u user_name_hoge https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials;
$ chmod 0600 ~/.gem/credentials
```

以下を実行すると...pushできました。
```
$ gem push sql_craft-0.1.0.gem
Pushing gem to https://rubygems.org...
Successfully registered gem: sql_craft (0.1.0)
```

実際にアップロードされました！！ (感動)
https://rubygems.org/gems/sql_craft

コマンドからも確認できました。
```
$ gem list -r sql_craft

*** REMOTE GEMS ***

sql_craft (0.1.0)
```

## 感想

普段何気なくインストールしているgemがどのようにして作られて
公開されるのか知れて、Rubyに関して知識が深められた。
今回作った、「sql_craft」gem は、databaseのcreate文とdrop文だけなので
今後少しずつ、table, column の方も拡張していこうと思います。


## 参考記事

https://guides.rubygems.org/make-your-own-gem/
https://qiita.com/9sako6/items/72994b8b1c00af4e61fe
https://techblg.app/articles/howt-make-gem-and-publish/