🎂

【卒業制作】MVPリリース時点での実装内容まとめ②(gem選定理由編)

2024/08/03に公開

はじめに

前回この記事で、卒業制作のMVPリリース時点での実装内容まとめ(技術スタック/実装機能編)を投稿しました。
今回はその内容の続きで、使用したgemとそのgemの選定理由を投稿します。
gemの選定理由は、私自身で考えた結果を投稿しておりますのでご了承いただけますと幸いです。

MVPリリース時点で使用したgem

gem 内容 備考
gem 'sorcery' ユーザー新規登録、ログイン・ログアウト機能、パスワードリセット機能
gem 'dotenv-rails' 環境変数の管理
gem 'kramdown' マークダウン形式での出力
gem 'kramdown-parser-gfm' マークダウン形式での出力
gem 'ransack' 検索機能
gem 'kaminari' ページネーション
gem 'rails-i18n' 日本語化対応
gem 'rubocop', 'rubocop-ast', 'rubocop-performance', 'rubocop-rails', 'rubocop-rake', 'rubocop-rspec' rubocop導入 rubocop、erb_lint導入参考資料
gem 'erb_lint' eslint導入 rubocop、erb_lint導入参考資料

上記gemを選定した理由

gem 'sorcery'
認証のgemとして比較させていただいたのは、gem 'device'とgem 'sorcery'です。

2024/8現在のstar数、contribution数。

gem star数、contribution数
gem 'device' star: 23.9k / contributors: 568
gem 'sorcery' star: 1.4k / contributors: 204

MVPリリースでは、ユーザー新規登録、ログイン・ログアウト機能、パスワードリセット機能の実装、本リリースではGitHub認証の導入を考えておりました。
GitHubのstar数でいくと圧倒的にgem 'device'の方が多いですが、GitHubや個人記事を参考に今回のアプリで必要な機能を考えてみました。

  • gem 'device': MVP、本リリースで必要な機能は10個のモジュール内に全て存在している。しかしタイムアウト機能・ロックアウト機能等、使用しない機能も入っている。
  • gem 'sorcery': 必要最低限の機能のみ提供しているため、オプションで必要な機能は追加していく。MVP・本リリース時点で必要な機能(パスワードリセット機能、GitHuB認証)は、オプションで追加できる。

gem 'device'を使用した場合、不要な機能が入っていることにより実装で不具合が生じる可能性を考え、gem 'sorcery'を使用しました。
gem 'sorcery'に関して、star数も少ないためか実装記事もほとんどなく、GitHub認証導入では少し苦戦をしました。
ただ基本的には公式GitHubで導入手順は載っていたため、きちんと読み込めば問題なく導入できるかと思います。

SorceryのサブモジュールExternalを使用してGitHub認証を実装した手順に関しては、下記にまとめております。

gem 'dotenv-rails'
今回使用している環境変数は下記になります。

  • MVP時点: Gmailパスワード(パスワードリセット機能)
  • 本リリース時点: GitHubのClientID・ClientSecrets(GitHub認証)、OpenAIのAPI(チャットボット機能)

環境変数の管理方法として、gem 'dotenv-rails'とrails5.2からデフォルトで導入されているcredentials.yml.encをでの管理を検討しました。
こちらの記事にも書いてあるとおり、credentials.yml.encはconfig/master.keyを使って復号して管理します。
.envファイルは何かの拍子でファイル中身を見られてしまう危険性もあるため、当初credentials.yml.encで環境変数を管理することを考えておりました。

しかし当時の操作方法が悪かったのか、なかなかうまく環境変数が設定できずgem 'dotenv-rails'を使用いたしました。
gem 'dotenv-rails'でもgitignoreファイルに.envを追加し忘れなければ、環境変数の管理方法として外部に漏れる危険性はないので今回採用に至りました。
今後アプリ開発をする際には、credentials.yml.encでも環境変数の管理をしてみたいと思っています。

gem 'kramdown' / gem 'kramdown-parser-gfm'
今回技術記事を投稿するアプリのため、マークダウンで出力できるgemの導入は必須事項でした。
実際に比較、技術検証したgemは、gem 'redcarpet'、gem 'kramdown'、gem 'qiita markdown'の3つになります。詳細はこちらの記事にまとめておりますが、技術検証をしてみて純粋なRubyで書かれており、拡張性が高いこと / 多機能で、複雑なMarkdown記法にも対応 / 依存関係が少ないことから、こちらのgemを採用させていただきました。

2024/7現在のstar数、contribution数になります。

gem star数、contribution数
gem 'redcarpet' star: 5k / contributors: 108
gem 'kramdown' star: 1.7k / contributors: 76
gem 'qiita markdown' star: 392 / contributors: 25

gem 'ransack'
検索gemは、こちらの記事内容や、The Ruby ToolboxのRails Search Filtersを参考にしました。

gem 'ransack'を使用した理由としては、Rails Search Filtersの中でもスコアが高かったこと、GitHubのstar数も多く最終更新日も一年以内であったことが挙げられます。

gem 'searchkick'もGitHubのstar数が多く候補にありましたが、高速検索 / 誤字訂正してくれる検索 / 部分合致検索機能は今回のアプリ開発では重要視していなかったため、より軽量な設計だと考えられるgem 'ransack'を選択しました。

2024/8現在のstar数、contribution数になります。

gem star数、contribution数 最終更新日
gem 'searchkick' star: 6.4k / contributors: 121 ?
gem 'ransack' star: 5.6k / contributors: 203 2023年10月

gem 'kaminari'
ページネーションに関しても、The Ruby ToolboxのPaginationカテゴリーより比較しました。
GitHubのstar数も多いこと、The Ruby Toolboxのスコアも高いことから選定しました。
また時間も限られている中で、ページネーション以外の機能に注力したかった関係もあり、実際に使用したことのあるgem 'kaminari'を選んでおります。
しかし、gem 'will_paginate'もGitHub数が多く、最終更新日も直近であることから今後のアプリ開発で使用してみたいと思っております。

gem 'rails-i18n'
多言語化対応のできるgemとして、Railsガイドを確認しRubyのI18ngemはRuby on Rails 2.2以降からRailsに同梱されているとのことで、こちらを採用しました。

gem 'rubocop', 'rubocop-ast', 'rubocop-performance', 'rubocop-rails', 'rubocop-rake', 'rubocop-rspec' / gem 'erb_lint'
コードの品質を向上させるために、こちらの記事を参考に必要なgemを導入しました。
導入したのがMVPリリース間際だったため、rubocop、erb_lintともに500近いコード修正がかかりました...。アプリ作成初期に入れておくべきだったと反省しています。

最後に

今回はMVPリリース時点で使用したgemとその選定理由について投稿しました。
最後までお読みいただき、ありがとうございました。

Discussion