Gemの研究ページ

背景

Railsのgemはよくよくメンテナンスしておかないと、ある日突然大変なことになりかねない。
業務の中で定期的に発生するgemのバージョンアップ。
そのためにGemについてよく理解したい!
なんなら、Gemを作ることで構造を理解したい!
と思ってこの記事を書きました。

いいなと思った他の人の取り組み

アップデートDAY

Railsのバージョンアップを行う上で悩んだことを見て、いいなって思いました。

「アップデートだけする日」って面白いですよね。
こういう日があると、合法的にメンテナンス作業ができるので、結果として将来の負債を解消し続けることになって良いと思います!
LittlePocket.Labでは、毎月第一土曜日をアップデートDAYにしようと決めました。

まずはGemを作ってみる

サンプルのGemを作ってみる

こちらの記事を参考にfujitatsuなるgemを作ってみる。

gem内のメソッドを実行

./bin/console
メソッド実行(テストファイルを参考に)

Gemのテスト

bundle exec rspec spec

Gemをビルド

gem build fujitatsu.gemspec

# 念の為インストールして実行してみる
gem install ./fujitatsu-0.1.0.gem
bin/console
Fujitatsu::Translator.shout("どうしてなんだよぉおお!!うわぁぁあああああああああああ")

作成したGemのリポジトリ

https://github.com/inomaru/gem_fujitatsu

Githubのリポジトリを公開しただけでrubygems.orgには登録していない。

自作のGemをRailsアプリにインストール

利用するには2つの方法がある。

  1. rubygems.orgからインストール
  2. Gitリポジトリから直接インストール(今回はこっち)
    • 利用するにはリポジトリを公開しておく必要がある
# Gemfile
gem 'fujitatsu', git: "https://github.com/inomaru/gem_fujitatsu", branch: :master
# --path vendor/bundleをつけることでインストールされた自作gemを編集できるようになるよ。
bundle install --path vendor/bundle

Gemのアップデート

ジェネレーターを作成

ドキュメントの修正

  1. *.gemspcec
  2. CHANGELOG.md

再ビルド

gem build fujitatsu.gemspec

読み込み側でのエラー

ビルド後の生成物であるfujitatsu-0.2.0.gemが含まれているとエラーを吐かれる。

Fetching https://github.com/inomaru/gem_fujitatsu
You have one or more invalid gemspecs that need to be fixed.
The gemspec at /home/ubuntu/blog/vendor/bundle/ruby/3.1.0/bundler/gems/gem_fujitatsu-3c668a091eb9/fujitatsu.gemspec is not valid. Please fix this gemspec.
The validation error was 'fujitatsu-0.2.0 contains itself (fujitatsu-0.2.0.gem), check your files list'

生成物をgit管理から除外

# .gitignore
/*.gem
git rm --cached fujitatsu-*.gem
git add .
git commit -m'[Remove] ビルド生成物をgit管理から除外'
git push origin HEAD

アプリ側で新しいバージョンを適応

まずはバージョンを範囲指定

# Gemfile
gem 'fujitatsu', '>= 0.2.1', git: "https://github.com/inomaru/gem_fujitatsu", branch: :master
# このコマンドでGemfile.lock内のgemバージョンが更新される
bundle update fujitatsu
# Gemfile.lockに基づいてインストール
bundle install
# せっかくなので追加したgeneratorを実行
$ rails g yukiusagi:index admin/users

Gemの開発環境

イメージ

graph TB   開発リポジトリ -.- Gemリポジトリ   開発リポジトリ -.- Railsリポジトリ
  1. Docker+Railsの開発環境を作る。(Gitは使用しない)
  2. Gemをインストール(–path vendor/bundle)だと便利
  3. Gemを編集(Gitからcloneしてくる方が良い)
  4. 編集が環境したらGitにpush。
# Dockerディレクトリ構造
./Dockerfile
./docker-compose.yml
./gem #ここでgit cloneしてgemを開発する(git管理対象)
./app #これはgemを読み込んでテストするためのrailsのアプリケーション(git管理対象にしても良い)

公式ドキュメントを元にもう一度Gemをゼロから作ってみる

公式ドキュメント

研究を終えて

意外にやっていけそうだなって思った、Gemの開発。

最初は難しそうだからサラッとやってみる程度にしようと思ったけれど、気づけば半日もGemの開発を進めてしまっていた。
結構楽しいんだよねえ。

開発環境を整える方が難しそう。

今回の作業で一番難儀したのが、Gemを開発するDocker環境の構築。
みんなローカルでの開発を想定しているみたいだけど、LittlePocket.Labは基本Dockerでの作業を想定している。
ネット上にDocker, RailsGemの環境構築なんていう記事はあまり見当たらなかった。

そもそも、GemのディレクトリとGemを使ってみるデバッグ用のRailsアプリ、最低でも2つのコンテナが必要だと思いました。
Gem開発側はそれほど難しくないとしても、Railsアプリ側はメンテナンスも必要だし、常にシンプルな構成を保っていないとデバッグもできないので大変。

少しずつGemを成長させていきたい。

開発環境にまだ難儀しそうだけど、Gemを使った自作メソッドの実装やgenratorの実行ができたのは大きな飛躍。
今後は、いろんなGemをダウンロードしてきて試してみて、触ってみて、なんならOSSにコントリビュートしてみたいなあ。。。