Gemファイルコーディングのベストプラクティス（和訳）


社内のコードや先輩の作ったアプリケーションのコードリーディングをしていると、「うお〜きゃっくいいな〜」となることは多々あるかと思います。

先日も同じような体験がGemfileを覗いたときにありました。

ん？Gemfileってなんかベストプラクティスとかあんのか？　と思ったのですが、Qittaにそれらしきものは無い・・・仕方ないんで英語の勉強も兼ねて[これ](http://mcdowall.info/posts/gemfile-best-practices-and-discourse/)を読みました

せっかくなんで英語読めないor読む気無いor自分より開発経験が浅い人向けに和訳を書きおこしました。
でも自分も大した英語力ないですし、意訳入りまくりなので（本当に。特に最後）、英語が出来る方、修正点の指摘お願い致します・・・

## GemファイルのベストプラクティスとDiscourse

=>
今週末私は新しいプロジェクト「Discourse」で、[ボーイスカウティング](https://github.com/discourse/discourse/pull/93)（※恐らくリファクタリングの意）を行いました。ボーイスカウトの規約では「あなたは訪れたときより、綺麗な状態でキャンプ場を去らなければならない」というものがあります。

「Discourse」はRailsのプロジェクトなので、ちょっとばかし大きなGemfileが存在します。

私は特に関わっていない初見のプロジェクトのコードを読む際、まず始めにGemfileを確認します。
どのような構成になっているかが大まかにチェックできますし、別プロジェクトをフォークしたものをカスタムしているかや、プライベートライブラリを使っているかもチェックできるからです。

## １３の誓約（※この名前は筆者の創作）

長年かけて私はGemfileに関するベストプラクティスを組織やチームで設定してきました。
これにより、新しいディベロッパーがチームに参加した時や、あなたのGemfileの秩序を守る時が楽になると思います。

以下がその規約です。
######５から１１は上から記載する順番になっています。

```
１：ハッシュロケット記法・ハッシュシンタックス記法のどちらかで記法を統一する（※Rails５からハッシュロケット記法は廃止になるようです）

２：区切り符号を統一する（アポストロフィか引用符のいずれか一つ）

３：Gemリファレンスのコメントは消す

４：Gemに関するコメントは、そのGemと同じ行に記載する

５：一番上にGitリポジトリから引っ張ってきているGemのグループを記載する

６：プロジェクトのPathから引っ張ってきているGemのグループをGitのグループの下に記載する

７：全ての環境で使用するGemをグループにして記載する

８：本番環境で使うGemをグループにして記載する

９：Asset周りのGemをグループにして記載する

１０：テスト関連のGemをグループにして記載する

１１；開発環境のみで使用するGemをグループにして記載する

１２：全てのグループにおいて、アルファベット順に上から記載する

１３：新しくGemを追加する際も上記のルールに従う（当たり前やろ）
```

（こ、、、これが・・・・ *「Gemfileの１３の誓約」* ッ！！）

##結果

これらの誓約はGemfileに永遠の平穏をもたらすだろう・・・。
秩序が保たれ、論理的かつ合理的。Gemfileに関する「へま」は圧倒的に減少する事を約束しよう。

特ににアルファベット順に整頓することで、Gemの存在をマインドスキャン、いや、 **「サイコショッカー」ばりのサーチ能力を全てのコードリーダーが手にする事ができる** と断言しよう。

##最後に
最後にRails newした直後に生成されるGemfileを整理整頓してお別れしよう。

アリーヴェデルチ。さよならだ。

```ruby:Before
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
```

####これが・・・・

```ruby:After
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

```
こうなります・・・・！たぶん。


では。