よいGemfileの書き方について。調べた内容をまとめてみることにする。
基本は、RuboCopのBundlerを参考にした。
LEVEL 1LEVEL 2その他にそれぞれ分類した。
RuboCop設定において、デフォルトで有効になっている項目、当たり前なものも多い
https://docs.rubocop.org/rubocop/cops_bundler.html#bundlerinsecureprotocolsource
# bad
source :gemcutter
source :rubygems
source :rubyforge
# good
source 'https://rubygems.org'
https://docs.rubocop.org/rubocop/cops_bundler.html#bundlerduplicatedgem
# bad
gem 'rubocop'
gem 'rubocop'
# bad
group :development do
gem 'rubocop'
end
group :test do
gem 'rubocop'
end
# good
group :development, :test do
gem 'rubocop'
end
# good
gem 'rubocop', groups: [:development, :test]
# good
# 条件分岐で書くのはOK
if Dir.exist?(local)
gem 'rubocop', path: local
elsif ENV['RUBOCOP_VERSION'] == 'master'
gem 'rubocop', git: 'https://github.com/rubocop/rubocop.git'
else
gem 'rubocop', '~> 0.90.0'
end
https://docs.rubocop.org/rubocop/cops_bundler.html#bundlerduplicatedgroup
# bad
group :development do
gem 'rubocop'
end
group :development do
gem 'rubocop-rails'
end
# bad
group :development, :test do
gem 'rubocop'
end
group :test, :development do
gem 'rspec'
end
# good
group :development do
gem 'rubocop'
end
group :development, :test do
gem 'rspec'
end
# good
gem 'rubocop', groups: [:development, :test]
gem 'rspec', groups: [:development, :test]
https://docs.rubocop.org/rubocop/cops_bundler.html#bundlergemfilename
設定に応じて
のいずれかの組み合わせになっていること
https://docs.rubocop.org/rubocop/cops_bundler.html#bundlerorderedgems
# bad
gem 'rubocop'
gem 'rspec'
# good
gem 'rspec'
gem 'rubocop'
# good
gem 'rubocop'
gem 'rspec'
RuboCopの設定において、デフォルトで無効になっている任意の項目
https://docs.rubocop.org/rubocop/cops_bundler.html#bundlergemcomment
OnlyForで特定のパラメータの場合だけ、コメントを強制することも可能
# bad
gem 'foo'
# good
# Helpers for the foo things.
gem 'foo'
https://docs.rubocop.org/rubocop/cops_bundler.html#bundlergemversion
デフォルトはversion指定が強制される。 設定でversion指定なしを強制することも可能。
# bad
gem 'rubocop'
# good
gem 'rubocop', '~> 1.12'
# good
gem 'rubocop', '>= 1.10.0'
# good
gem 'rubocop', '>= 1.5.0', '< 1.10.0'
# good
gem 'rubocop', branch: 'feature-branch'
# good
gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
# good
gem 'rubocop', tag: 'v1.17.0'
groupも辞書順に書く
>=演算子をなるべく使う
Railsのセットアップ時に自動で記述されるGemの書き方、指定、コメントはそのままにしておき、その下からルールを適用する
以下を参考にするとよさそう。
https://r7kamura.com/articles/2024-11-30-gemfile
上記をもって、自分がGemfileを作成したりメンテナンスする上での方針を書いておく。 随時追記していく予定。
例えば、GraphQL関連のGemを書く場合は以下のような順番で記述する
# GraphQL file upload server
gem 'apollo_upload_server'
# GraphQL
gem 'graphql'
# GraphQL page based pagination
gem 'graphql-pagination'
こっちだと、分類を考える必要がなく迷いにくい
source "https://rubygems.org"
# Fixed order
gem "rails", "5.1.4"
# Alphabetical order
gem "aaa"
gem "bbb", "1.2.3" # https://github.com/bbb/bbb/issues/123
gem "ccc"
簡易ver
# GraphQL
# GraphQL file upload server
gem 'apollo_upload_server'
# GraphQL Ruby
gem 'graphql'
# GraphQL page based pagination
gem 'graphql-pagination'
# Pagination
# Kaminari
gem 'kaminari-activerecord'
# Authorization
# Pundit
gem 'pundit'
# Google Cloud
# Google Cloud Storage
gem 'google-cloud-storage', '~> 1.11', require: false
# HTTP Client
# Faraday http cache
gem 'faraday-http-cache'