【誰でもできる】自作Gemを作って公開するまでの道のり


こんにちは、とまだです。

[Ruby on Rails Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ruby-on-rails)、2 日目の記事をお届けします！

みなさんは、「**自分で Gem を作ってみたい！**」と思ったことはありませんか？

自分が作った Gem（ライブラリ）が世界中の Ruby on Rails アプリで使われるなんて、ちょっとテンション上がりますよね。

そこで、今回は Gem の作り方を**初心者向け**に解説していきたいと思います。

以前、無駄な Gem を作った経験をもとにしているので、よければそちらもご覧ください。

https://qiita.com/tomada/items/579d54283f03a0dc6a9b

## Gem って何？

まずは、そもそも Gem とは何かおさらいしましょう。

Gem とは、Ruby で作られたライブラリやプログラムをパッケージ化したものです。

例えば、以下のようなものが Gem として提供されています。

- **devise（認証機能）**
- **kaminari（ページネーション）**
- **carrierwave（ファイルアップロード）**

これらは特に Rails アプリでよく使われる Gem ですが、他にもシンプルなものから複雑なものまで、さまざまな Gem があります。

## Gem を作る準備

それでは、実際に Gem を作っていきましょう。

### 1. 必要なツールをインストール

まずは必要なツールをインストールします。

```bash
gem install bundler
```

### 2. Gem の雛形を作成

次に、Gem の雛形を作成します。

```bash
bundle gem my_awesome_gem
```

このコマンドを実行すると、以下のようなファイル構造が作成されます。

```
my_awesome_gem/
├── CODE_OF_CONDUCT.md
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── bin
│   ├── console
│   └── setup
├── lib
│   ├── my_awesome_gem
│   │   └── version.rb
│   └── my_awesome_gem.rb
├── my_awesome_gem.gemspec
└── spec
    ├── my_awesome_gem_spec.rb
    └── spec_helper.rb
```

## 主要なファイルの説明

作成された各ファイルについて、重要なものを説明します。

### my_awesome_gem.gemspec

このファイルは、Gem の情報を定義する場所です。

```ruby:my_awesome_gem.gemspec
Gem::Specification.new do |spec|
  spec.name          = "my_awesome_gem"
  spec.version       = MyAwesomeGem::VERSION
  spec.authors       = ["あなたの名前"]
  spec.email         = ["あなたのメールアドレス"]
  spec.summary       = "Gemの簡単な説明"
  spec.description   = "Gemの詳細な説明"
  spec.homepage      = "https://github.com/your_name/my_awesome_gem"
  spec.license       = "MIT"

  # 依存するGemを指定
  spec.add_dependency "rails", ">= 6.0.0"
end
```

ビルドする際には、このファイルに記載された情報が使われますので、できるだけ正確に記入しましょう。

### lib/my_awesome_gem.rb

このファイルは、Gem のメインファイルです。

```ruby:lib/my_awesome_gem.rb
require "my_awesome_gem/version"

module MyAwesomeGem
  class Error < StandardError; end
  # ここにコードを書いていく
end
```

### lib/my_awesome_gem/version.rb

バージョン情報を管理するファイルです。

```ruby:lib/my_awesome_gem/version.rb
module MyAwesomeGem
  VERSION = "0.1.0"
end
```

## Gem の中身を実装する

では、実際に Gem の中身を実装していきましょう。

例として、文字列に「！」を付けるメソッドを作ってみます。

```ruby:lib/my_awesome_gem.rb
module MyAwesomeGem
  def self.add_exclamation(text)
    "#{text}！"
  end
end
```

## Gem をビルドする

実装が完了したら、作成した Gem をビルドしましょう。

```bash
gem build my_awesome_gem.gemspec
```

このコマンドを実行すると、`my_awesome_gem-0.1.0.gem`というファイルが作成されます。
ここでのバージョン番号は、`lib/my_awesome_gem/version.rb`で指定したものです。

これを、後に RubyGems.org に公開するためのファイルとして使います。

## Gem を公開する

最後に、作成した Gem を RubyGems.org に公開します。

### 1. RubyGems.org にアカウントを作成

まだアカウントを持っていない場合は、[RubyGems.org](https://rubygems.org)でアカウントを作成します。

API キーを登録したりする手順がありますが、指示が丁寧に表示されるので、従っていくだけで大丈夫です。

### 2. Gem をプッシュ

次に、作成した Gem を RubyGems.org にプッシュします。

```bash
gem push my_awesome_gem-0.1.0.gem
```

これで、あなたの Gem が世界中の誰でも使えるようになります！

## 作った Gem を使ってみる

公開した Gem は、他の Gem と同じように使うことができます。

### Gemfile に追加

```ruby:Gemfile
gem "my_awesome_gem"
```

### インストール

```bash
bundle install
```

### 使用例

```ruby
require "my_awesome_gem"

MyAwesomeGem.add_exclamation("Hello") #=> "Hello！"
```

## まとめ

いかがでしたか？

いくつかのコマンドと、数ファイルを作成するだけで、自分だけの Gem を作ることが分かったかと思います。

個人開発でアプリを作ることも学びはありますが、他のエンジニアがライブラリとして使ってくれるような Gem を作ることも、良い勉強になるかと思います。

OSS に貢献することで、自分のスキルアップにもつながりますので、ぜひ挑戦してみてください！

## 他にもアドベントカレンダー記事を書いています！

他にも、2024 年のアドベントカレンダーに参加しています。

以下の記事でまとめているので、よければ他の記事も読んでいただけると嬉しいです！

https://qiita.com/tomada/items/025b3745df8c484f5856