社内のコードや先輩の作ったアプリケーションのコードリーディングをしていると、「うお〜きゃっくいいな〜」となることは多々あるかと思います。
先日も同じような体験がGemfileを覗いたときにありました。
ん?Gemfileってなんかベストプラクティスとかあんのか? と思ったのですが、Qittaにそれらしきものは無い・・・仕方ないんで英語の勉強も兼ねてこれを読みました
せっかくなんで英語読めないor読む気無いor自分より開発経験が浅い人向けに和訳を書きおこしました。
でも自分も大した英語力ないですし、意訳入りまくりなので(本当に。特に最後)、英語が出来る方、修正点の指摘お願い致します・・・
GemファイルのベストプラクティスとDiscourse
=>
今週末私は新しいプロジェクト「Discourse」で、ボーイスカウティング(※恐らくリファクタリングの意)を行いました。ボーイスカウトの規約では「あなたは訪れたときより、綺麗な状態でキャンプ場を去らなければならない」というものがあります。
「Discourse」はRailsのプロジェクトなので、ちょっとばかし大きなGemfileが存在します。
私は特に関わっていない初見のプロジェクトのコードを読む際、まず始めにGemfileを確認します。
どのような構成になっているかが大まかにチェックできますし、別プロジェクトをフォークしたものをカスタムしているかや、プライベートライブラリを使っているかもチェックできるからです。
13の誓約(※この名前は筆者の創作)
長年かけて私はGemfileに関するベストプラクティスを組織やチームで設定してきました。
これにより、新しいディベロッパーがチームに参加した時や、あなたのGemfileの秩序を守る時が楽になると思います。
以下がその規約です。
5から11は上から記載する順番になっています。
1:ハッシュロケット記法・ハッシュシンタックス記法のどちらかで記法を統一する(※Rails5からハッシュロケット記法は廃止になるようです)
2:区切り符号を統一する(アポストロフィか引用符のいずれか一つ)
3:Gemリファレンスのコメントは消す
4:Gemに関するコメントは、そのGemと同じ行に記載する
5:一番上にGitリポジトリから引っ張ってきているGemのグループを記載する
6:プロジェクトのPathから引っ張ってきているGemのグループをGitのグループの下に記載する
7:全ての環境で使用するGemをグループにして記載する
8:本番環境で使うGemをグループにして記載する
9:Asset周りのGemをグループにして記載する
10:テスト関連のGemをグループにして記載する
11;開発環境のみで使用するGemをグループにして記載する
12:全てのグループにおいて、アルファベット順に上から記載する
13:新しくGemを追加する際も上記のルールに従う(当たり前やろ)
(こ、、、これが・・・・ 「Gemfileの13の誓約」 ッ!!)
結果
これらの誓約はGemfileに永遠の平穏をもたらすだろう・・・。
秩序が保たれ、論理的かつ合理的。Gemfileに関する「へま」は圧倒的に減少する事を約束しよう。
特ににアルファベット順に整頓することで、Gemの存在をマインドスキャン、いや、 「サイコショッカー」ばりのサーチ能力を全てのコードリーダーが手にする事ができる と断言しよう。
最後に
最後にRails newした直後に生成されるGemfileを整理整頓してお別れしよう。
アリーヴェデルチ。さよならだ。
source 'https://rubygems.org'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.3'
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.1.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '~> 0.4.0', group: :doc
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'
# Use Unicorn as the app server
# gem 'unicorn'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug'
# Access an IRB console on exception pages or by using <%= console %> in views
gem 'web-console', '~> 2.0'
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring'
end
これが・・・・
source 'https://rubygems.org'
gem 'bcrypt'
gem 'jbuilder'
gem 'jquery-rails'
gem 'rails', '4.2.3'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'sqlite3'
gem 'therubyracer', platforms: :ruby
gem 'turbolinks'
group :production do
gem 'unicorn'
end
group :assets do
gem 'coffee-rails'
gem 'sass-rails'
gem 'uglifier'
end
group :development, :test do
gem 'byebug'
gem 'spring'
gem 'web-console'
end
group :development do
gem 'capistrano-rails'
end
こうなります・・・・!たぶん。
では。