【個人用】gemの使用理由まとめ
はじめに
こんにちは!大ちゃんの駆け出し技術ブログです。 下記Gemfileですがこれが自分のPFで使用したものです。
# Gemfile source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.7.3' gem 'rails', '6.0.3.5' # Assets gem 'sass-rails', '>= 6' gem 'webpacker', '~> 4.0' # Authentication for Slack gem 'devise', github: 'heartcombo/devise', branch: 'ca-omniauth-2' gem 'ginjo-omniauth-slack', require:'omniauth-slack' gem "omniauth-rails_csrf_protection" # Slack API gem 'slack-ruby-client' # OGP gem 'meta-tags' # 権限 gem "pundit" gem "administrate" # Serializer gem 'active_model_serializers', '~> 0.10.0' gem "ams_lazy_relationships" gem 'puma', '~> 4.1' gem 'carrierwave' gem 'fog-aws' # Config gem 'dotenv-rails', require: 'dotenv/rails-now' gem 'parser', '< 2.6.6.0' # cron gem 'whenever', require: false # Database gem 'pg', '>= 0.18', '< 2.0' gem 'redis-rails' # Model gem 'enum_help' gem 'active_hash' gem 'public_uid' # UI/UX gem 'rails-i18n' gem 'devise-i18n' gem 'jbuilder', '~> 2.7' gem "tailwindcss-rails", "~> 0.3.3" gem 'slim-rails' gem 'html2slim' # Error monitoring gem 'sentry-rails' gem 'sentry-ruby' # Performance monitoring gem 'newrelic_rpm' gem 'bootsnap', '>= 1.4.2', require: false group :development, :test do # Test gem 'factory_bot_rails' gem 'rspec-rails' gem 'simplecov', require: false #CLI gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' gem 'spring-commands-rspec' # Debugger gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] gem 'better_errors' gem 'binding_of_caller' gem 'pry' gem 'pry-byebug' gem 'pry-doc' gem 'pry-rails' # Code analyze gem 'rails_best_practices' gem 'rubocop' gem 'rubocop-checkstyle_formatter' gem 'rubocop-rails' gem 'rubocop-rspec' end group :development do gem 'bullet' gem 'foreman' gem 'listen', '~> 3.2' gem 'web-console', '>= 3.3.0' end group :test do gem 'capybara' gem 'faker' gem 'webdrivers' gem "webmock" end gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
今回は各Gemの使用理由を雑に述べていきたいと思います。
devise
言わずと知れた認証系アプリに必要な機能を簡単に追加できる便利なgem
仕様理由
Slackログインの方法を様々な方法で試した結果、deviseとomniauthの方法しかできなかったため。
SlacKという比較的ユーザ情報の悪用の危険度が高いものを使用するので、認証周りはあまり自分でコーディングすることはセキュリティ面で不安だったため避けたかった ↓ 認証gemを使用することは必須 ↓ * Sorcery・・・slack.rbが2016年より更新されていなかったため、正しく認証できずエラーが返ってきていた。
もうエラーは解決されたみたい。正しくログインできるかもしれない。 github.com
devise-token-auth・・・講師にもPRを出して1週間ほど試していたが解決できず断念
devise × omniauth・・・唯一slackログインが正常にできて、かつ認証をdeviseに任せられる方法だった
~'heartcombo/devise’とマスターブランチを指定している理由は対応Gemがrubygemsにリリースされていないので、masterブランチを指定している
~gem 'devise', github: 'heartcombo/devise', branch: 'ca-omniauth-2'と指定している理由については下記記事を参照
gem 'ginjo-omniauth-slack', require:'omniauth-slack'
Slackのauth用のgem。
仕様理由
比較的スター数が少ないが、メンテナンスが頻繁にされていたため使用しました。 用途としてはauthと同じ。
require:'omniauth-slack'としている理由は公式の書き方にそう書いてあるから
gem "omniauth-rails_csrf_protection"
仕様理由
omniauth2.0に対応するため。詳しくは下記記事。
gem 'slack-ruby-client'
SlackとAPI通信を行うためのgem。
仕様理由
botと通信を行うときには基本的にこれを使っている。 ※ ユーザーの投稿とかは基本的にfaradayでAPI通信。
gem "pundit"
認可を管理するGem
仕様理由
Pundit vs cancancan
Punditの場合各モデルに対して権限を設定できる
cancancanの場合、各モデルの権限をすべてAbilityファイルに記述する
よって、モデル数が多い自分のアプリではPunditのほうがいいと思った
gem "administrate"
管理画面自体は自分だけがログインできる実装
理由:管理周りでもしミスでもしてSlack情報流れたら怖いと思い、自分だけが管理できる仕様にした。
よって比較的簡易的に管理画面を実装したかった
rails_admin active_admin Administrate
Administrateを選んだ理由は後々管理画面を実装する際にお客様にも使ってもらう必要があるため、カスタマイズの拡張性が高いgemを選んだ
gem 'active_model_serializers', '~> 0.10.0'
仕様理由
スター数が多きいのと、各モデルのシリアライズされたときのJSONのカスタマイズが容易。
gem "ams_lazy_relationships"
仕様理由
batch_loaderを使用してActiveModelSerializerのN + 1問題を良しなに解決してくれるgem
理由が少し心配なので後で下記記事から理由を抽出 bajena3.medium.com
gem 'carrierwave'
画像をアップロードするときに使われるライブラリ。
仕様理由
viewsをvue.jsで書く場合は、Carrier Waveを使うらしい(下記記事を参照)
- 理由 erbを書かない場合はactive storageの強みを活かせない
erbを使うか否かの違いは、HTML内に<%= %>を使えるかどうか Active Storageは前提として、<%= %>でform_withで入力したりや@imageとかで画像表示をする時に、この中に画像の処理を記述することで、controllerのコード記述を少なく書ける
言い換えれば、<%= %>を使わずに画像を処理・保存するとなると、どこで画像処理などのプログラムを記述すれば良いかわかりにくい
その点、CarrierWaveを使う方法では、CarrierWave::Uploaderというクラスが生成され、ここに画像の処理するコードを記載すれば良いんだなとわかりやすい
gem 'fog-aws'
carriwaveを使用してAWSにアップロード。
仕様理由
carriwaveの通常の保存先はpublic/uploads配下
ファイルが重くなるためAWSのS3にアップロード
gem 'dotenv-rails', require: 'dotenv/rails-now'
環境変数管理
仕様理由
シンプルに環境変数を記載できる
heroku上だと環境変数をいちいち指定しなければならない。
master.keyファイルをアップロードできるのがcredentialを使用するメリット
gem 'enum_help'
仕様理由
enumの値を国際化できるから。機能が仕様理由。
gem 'active_hash'
仕様理由
Prefectureを登録する際に固定値となるため導入
のちにCategoryテーブルを追加するときにも使用
しかし、Categoryテーブルの場合はカテゴリーが増える可能性があったため、テーブルを作ってしまえばよかったと反省している
わざわざデプロイせずともデータを作成すればCategoryを追加できるのが強み
gem 'public_uid'
ランダム値を格納するカラムを作成。
仕様理由
SecureRandomの存在を知らなかった。。。変更するか検討する。
gem "tailwindcss-rails", "~> 0.3.3"
tailwindをインストールする
仕様理由
プロフ帳のデザインにする以上、Bootstrap感はあまり出したくなかったため導入
他にもsemantic UIとかあったけど、Tailwindのほうが流行っていたと感じたため導入
ファイル自体は非常に重いらしいが導入してそこまで重いと感じなかったので使用
gem 'sentry-rails' & gem 'sentry-ruby'
Sentryを導入するgem
仕様理由
bugsnagと比較してドキュメントの記事数が豊富
Heroku上だと一番使われている
それに伴う開発サポート
gem 'newrelic_rpm'
アプリケーションのパフォーマンスをあらゆる角度からリアルタイムで可視化
仕様理由
正直まだ活用できていないので後で見る
gem 'factory_bot_rails'
定義構文をわかりやすく書くことができるテストデータを作成するgem
仕様理由 テストデータとしては一番メジャーだと思う
gem 'rspec-rails'
こちらも言わずと知れたテストGem。
仕様理由
Miniテストよりも多く現場で使われているテスト形式だから
gem 'simplecov', require: false
Rspecで書いたテストのカバレッジを計測してくれるツールです。カバレッジとは、コード全体に対して、どの程度の範囲をテストがカバーできているかを算出したもの。
仕様理由
ある程度Rspecはちゃんと書きたいと思ってたため、simplecovがあればどの程度の範囲をテストがカバーしているか見れるので便利。
gem 'spring'
Spring は Rails アプリケーションの preloader(プリローダー)の gem 。 Rails アプリケーションをバックグラウンドで走らせたままにしておくことにより(pre + load = 前もってロードしておく)、bin/rails や bin/rake コマンドの2回目以降の起動時間が短縮
gem 'spring-watcher-listen', '~> 2.0.0'
springのファイルシステム検知方法をポーリング方式からlistenを使用した方法に変更する。 ポーリングとは、主となるシステムが他のシステムに対して一定間隔で順番に変更がないか確認する制御方式で、いつ起こるかわからないイベントを監視する際に用いられる。
gem 'spring-commands-rspec'
Springのrspecコマンドを実装
仕様理由 bin/rspecを使うことで二度目以降のrspecの実行時間の短縮につながる
gem 'better_errors'
デフォルトのエラー画面をわかりやすく整形してくれるgem。
仕様理由
デフォルトのエラーが面よりもデバッグがしやすく見やすい
### gem 'binding_of_caller'
上記better_errorsと一緒に使うことで、ブラウザ上でirbを使えるようになるgem。
仕様理由
デバッグが不可彫りできるので便利
gem 'pry'
もしかしたらいらないかも。。。。。。。 調べたら来れなくても動くかもしれない。。。
gem 'pry-byebug', gem 'pry-doc', gem 'pry-rails'
pry-rails
- Rails console で Pry が起動するようになる
- pry-rails を入れるまでは irb が起動する
- show-routes などのコマンドが Rails console で使えるようになる
- Rails console で help と打つと、使えるコマンドがわかる
- binding.pry をソースコード中に挟むとそこがブレークポイントとなり、そこで処理を止めてデバッグできるようになる
- pry-rails だけではステップ実行はできない
pry-byebug
- binding.pry で止めたところからステップ実行ができる
- 例えば next コマンドで一行ずつ実行できる
- $ 現在のソースを表示
pry-doc
- show-method コマンドで C で書かれたコードやドキュメントも出力できるようになる
- show-method は Pry のコマンドで通常は Ruby で書かれたコードやドキュメントのみ出力できる
参考 qiita.com
gem 'rails_best_practices'
rails_best_practicesは、railsアプリのコードの質をチェックするメトリクスツール
gem 'rubocop', gem 'rubocop-checkstyle_formatter', gem 'rubocop-rails', gem 'rubocop-rspec'
Rubyに関わる構文規則チェック
Rubocopを回す際にチェックするフォーマットを指定できる
$ bundle exec rubocop --require rubocop/formatter/checkstyle_formatter --format RuboCop::Formatter::CheckstyleFormatter --no-color --rails --out tmp/checkstyle.xml
Railsに関わる構文規則チェック
rspecに関わる構文規則チェック
仕様理由
インデントやコードに問題がある場合の自動検出。ある程度きれいなコードにしたかった。
gem 'bullet'
N + 1問題を検出できる
仕様理由
モデル数が多くN + 1問題が非常に出やすいと思ったため、bulletを導入
gem 'listen', '~> 3.2'
ファイルの変更、追加、削除を検知し、何かしらの処理を行うことができるようになる。
gem 'web-console', '>= 3.3.0'
ViewまたはControllerのコードに「console」というメソッドを記述することでブラウザ上でコンソールの操作ができるようになる。
gem 'capybara'
ブラウザ上でテストを確認できる
「リンクのクリック」「フォームの入力」「画面表示の検証」などをコマンドでシミュレートできる
仕様理由 Rspecを実行する際にブラウザでも意図したとおりに画面が遷移しているか確認できるため
gem 'faker'
簡単に多種多様なダミーデータをデータベースに投入できるgem
仕様理由 ダミーデータ用
gem 'webdrivers'
webdriverの自動インストール、自動更新を行う。
gem "webmock"
外部へのHTTPリクエストをスタブ化してくれる
外部API呼び出しのあるアプリケーションを開発する場合、テストやローカル環境での動作確認まで本物のAPIを呼び出していると、時間がかかり開発の生産性が下がるのでAPIモックを使用する
仕様理由 APIを使用しているためSlackログイン用のMocなどが必要だった。
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
タイムゾーンが記載されたライブラリで、Windowsではタイムゾーンが記載されたファイルがない為、このgemが必要となる。