こんにちは、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
コードに潜むセキュリティ問題をチェックします。
- リポジトリ: https://github.com/presidentbeef/brakeman
- 初期設定:
rails new
で使うなら不要 - 実行方法: プロジェクトのルートディレクトリで
bundle exec brakeman
を実行
bundler-audit
Gemfile.lockのgemバージョンを調べてセキュリティ問題をチェックします。
- リポジトリ: https://github.com/rubysec/bundler-audit
- 初期設定: 不要
- 実行方法: プロジェクトのルートディレクトリで
bundle exec bundle-audit
を実行
コマンドはbundler-auditではなくbundle-auditです。
RSpec一式
追記(2018/10/16): factory_girlをfactory_botに更新しました
Railsで広く使われているテスティングフレームワークです。
factory_bot_railsはテストデータをfactory_botで準備するのに使われます。RSpecとfactory_botは案件を問わず使うことになると思います。
- リポジトリ: https://github.com/rspec/rspec-rails
- リポジトリ: https://github.com/thoughtbot/factory_bot_rails
- 初期設定:
rails generate
の前に設定が必要(参考: RailsでRSpecによるテスト環境を構築する手順) - 実行方法: RSpecの設定を終えてからプロジェクトのルートディレクトリで
bundle exec rspec
を実行
実行前に、RSpecやfactory_botの設定が必要です。
参考: RSpecと一緒に使うことの多いgem
以下は主なものです。
- 受け入れテスト・ブラウザ表示テスト用: capybara、selenium-webdriver
- テストデータベース初期化用: database_cleaner -- Rails 5.1以降のシステムテストでは不要です
- 日時のテスト用: timecop
rack-mini-profiler
開発中にリクエストの所要時間などをブラウザ画面の隅に表示できます。クリックすると詳細が表示されます。
- リポジトリ: https://github.com/MiniProfiler/rack-mini-profiler
- 初期設定: 不要
- 実行方法: インストールした環境でブラウザを開くだけでよい
better_errorsとbinding_of_caller
better_errorsはエラー時にリッチなデバッグ画面を表示します。binding_of_callerもインストールするとデバッグ画面でコードや変数の値を変更することもできます。
- リポジトリ: https://github.com/charliesome/better_errors
- リポジトリ: https://github.com/banister/binding_of_caller
bullet
n+1問題を検出できます。
- リポジトリ: https://github.com/flyerhzm/bullet
- 初期設定: 不要(必要ならホワイトリストを設定: Bulletのホワイトリストの設定)
- 実行方法: gemがインストールされていれば、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
- リポジトリ: flyerhzm/rails_best_practices
- 初期設定: 不要
- 実行方法:
bundle exec rails_best_practices .
Railsのベストプラクティスをサジェスチョンするgemです。素のRails 5.2.1では「問題なし」となります。さまざまな出力オプションがあります。
参考: rails_best_practicesを入れてみた(感謝を言葉にする! 4回目) - Qiita