Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

[Rails 5] rails newで常に使いたい厳選・定番gemリスト(2017-2018年版)

こんにちは、hachi8833です。

主にRails 5を念頭に、BPSのWeb開発で厳選された定番gemリストをまとめました。この記事は今後も随時更新しますのでよろしくお願いします。

  • 2017/07/24: LicenseFinderとRufoを追加しました。
  • 2017/11/09: Annotate(AnnotateModels)を追加しました。
  • 2018/10/24: database_cleanerがRails 5.1以降で不要であることを追記しました。
  • 2018/10/24: rails_best_practicesを追加し、Rails5.2.1で検証しました。

概要

Rails でrails newした後、rails generateする前に「そうだ、あのgemとあのgemも追加しなきゃ」となることはよくあります。

gemをあれもこれも追加すると余分な問題を抱えることになりがちなので、gemリストはrails newするときからスリムに保っておきたいものです。Railsを始めて間もない人には特にgemを厳選することをおすすめします。

なお、以前は定番gem追加済みのGemfileやアプリケーションテンプレートを作ってみたこともありましたが、rails newを頻繁に行うのでなければメンテナンスの手間に引き合わないのでやめました。

環境

  • Rails: 5.2.1
  • Ruby: 2.5.3
  • Bundler: 1.16.6(gem update bundlerで最新にアップデートできます)

TechRacho記事『[Rails 5] rbenvでRubyをインストールして新規Rails開発環境を準備する』の方法でRuby/Rails環境を構築する前提です。

定番gemリスト(プロジェクト非依存)

案件や開発環境にかかわらず、常に追加・変更しておきたい厳選gemです。

  • gem名のリンクをクリックすると記事後半の詳細に移動します。
  • ファイル保存時のRSpec自動実行など、IDEでカバーできるgemは含めていません。
  • RDBMSはデフォルトのSQLiteのままにしてあります。MySQLにするかPostgreSQLにするかについては別途設定してください。
gem 機能 development test production
rubocop コーディングルールのチェック
brakeman 開発中の静的セキュリティチェック
bundler-audit gemのセキュリティ情報のチェック
RSpec一式 テスティングフレームワーク
rack-mini-profiler パフォーマンスをブラウザに表示
better_errorsとbinding_of_caller エラー時に表示される使いやすいデバッグ画面
bullet n+1問題を検出
LicenseFinder 依存関係のあるライブラリのライセンスをチェック
rufo ミニマムなRubyフォーマッタ
Annotate モデルなどにスキーマをコメントで貼ってくれる
rails_best_practices コードのベストプラクティスをサジェスチョンする

Gemfile

Rails 5.0.1の新品Gemfileに厳選gemのみを追加したものを参考までに貼ります。

  • 元のコメント行は削除してあります。
  • rails newで使うのが前提なので、既存プロジェクトでは状況に合わせてGemfileに追記してください。
source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

gem 'rails', '~> 5.0.1'
gem 'sqlite3'
gem 'puma', '~> 3.0'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'

gem 'jquery-rails'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

group :development, :test do
  gem 'byebug', platform: :mri
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'license_finder'
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '~> 3.0.5'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem 'rubocop'
  gem 'brakeman'
  gem 'bundler-audit'
  gem 'rack-mini-profiler'
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'bullet'
  gem 'rufo'
  gem 'annotate'
  gem 'rails_best_practices', require: false
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

上のGemfileを反映してからプロジェクトのルートディレクトリでbundle installを実行すれば、厳選gemのインストールが完了します。

追伸

gem名のハイフンやアンダースコアが違っているとインストールできません。rubygems.orgで検索できる名前にする必要があります。

  • ◯: better_errors
  • ☓: better-errors、bettererrors、BetterErrors

地味ですが割りと間違えやすいんですよね(間違えました)。

各gemの概要

概要にとどめていますので、詳細についてはリンク先をご覧ください。

RuboCop

http://rubocop.readthedocs.io/en/latest/のスタイルにもとづいてコードのスタイルをチェックします。

デフォルトのままだとうんざりするほどエラーが出力されるので、プロジェクトの状態やスタイルに合わせて.rubocop.ymlの設定をカスタマイズするのが普通です。手動でカスタマイズするのはかなり大変なので、後述の「急ぎの場合に使える設定方法」を使うとよいでしょう。

  • リポジトリ: https://github.com/bbatsov/rubocop
  • 初期設定: 後述の「急ぎの場合に使える設定方法」などで.rubocop.ymlを設定する
  • 実行方法: プロジェクトのルートディレクトリでbundle exec rubocopを実行

(↑bundle execは非常によく使うので、私はbashでalias be='bundle exec'を設定しています: 以下同様)

http://rubocop.readthedocs.io/en/latest/の解説についてはTechRachoの連載『Rubyスタイルガイドを読む』シリーズもどうぞ。

急ぎの場合に使える設定方法

プロジェクトによっては以下の方法で余分なエラーを効果的に抑制できます。

  • プロジェクトのルートディレクトリでbundle exec rubocop --auto-gen-configを実行して.rubocop-todo.ymlを生成する
  • .rubocop-todo.ymlを複製して.rubocop.ymlという名前にする

この方法で現在のプロジェクトのスタイルをすべて容認する.rubocop.ymlを作れます。その後で、検査したい項目を.rubocop.ymlから順次外すことで、1項目ずつチェックできます。

brakeman

コードに潜むセキュリティ問題をチェックします。

bundler-audit

Gemfile.lockのgemバージョンを調べてセキュリティ問題をチェックします。

コマンドはbundler-auditではなくbundle-auditです。

RSpec一式

追記(2018/10/16): factory_girlをfactory_botに更新しました

Railsで広く使われているテスティングフレームワークです。
factory_bot_railsはテストデータをfactory_botで準備するのに使われます。RSpecとfactory_botは案件を問わず使うことになると思います。

実行前に、RSpecやfactory_botの設定が必要です。

参考: RSpecと一緒に使うことの多いgem

以下は主なものです。

rack-mini-profiler

開発中にリクエストの所要時間などをブラウザ画面の隅に表示できます。クリックすると詳細が表示されます。

better_errorsとbinding_of_caller

better_errorsはエラー時にリッチなデバッグ画面を表示します。binding_of_callerもインストールするとデバッグ画面でコードや変数の値を変更することもできます。

bullet

n+1問題を検出できます。

LicenseFinder

依存関係のあるライブラリのライセンスを一覧表示してくれます。Rubyに限定せず使えます。

  • リポジトリ: https://github.com/pivotal/LicenseFinder/
  • 初期設定: 不要
  • 実行方法: license_finderを実行することでライセンスが一覧表示されます。Bundlerを使っている場合はbundle exec license_finderなどで実行します。テストやCIで実行するとよいでしょう。

rufo

  • リポジトリ: https://github.com/ruby-formatter/rufo
  • 初期設定: 不要(`/.rufoファイルで設定変更も可能)
  • 実行方法: rufo ファイル名で、最小限のフォーマット修正を行ってくれます。高速なのがありがたい点です。
    • コード冒頭のインデントを修正
    • 配列やハッシュの要素を揃える
    • カンマの前のスペースを除去
    • 空行を1つまでにする
    • メソッド間に空行を1つ置く
    • 末尾のセミコロンを削除
    • 末尾のスペースを削除
    • ファイル末尾に空行を1つ置く

Annotate(旧AnnotateModels)

  • リポジトリ: ctran/annotate_models
  • 初期設定: 不要
  • 実行方法: プロジェクトディレクトリでannotateを実行するとスキーマがコメントとして各種ファイルに追加されます。annotate --exclude fixturesなどとすれば除外ディレクトリを指定できます。annotate --deleteとすればスキーマを削除できます。

スキーマを追加したくないファイルに# -*- SkipSchemaAnnotationsというマジックワードを書けます。

Railsの場合、rails g annotate:installしてからrake annotate_modelsなどの方法でスキーマを追加することもできます。
この場合、マイグレーションするとスキーマも自動で更新されます。自動更新を止めたいときは、lib/tasks/auto_annotate_models.rake'skip_on_db_migrate' => 'true',を設定します。

おまけ: rails generateが動かないとき

bundle exec rails startコマンドを実行した後、bundle exec rails generateコマンドを実行しても先に進まなくなってしまうことがあります。

その場合、Rails 5で標準になったspringというプリローダーgemが動いたままになっている可能性があります。

bundle exec spring stopを実行してspringを止めるとgenerateできるようになります。

rails_best_practices

Railsのベストプラクティスをサジェスチョンするgemです。素のRails 5.2.1では「問題なし」となります。さまざまな出力オプションがあります。

参考: rails_best_practicesを入れてみた(感謝を言葉にする! 4回目) - Qiita

関連記事


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。