読者です 読者をやめる 読者になる 読者になる

#12 Railsの面倒な初期設定を自動化するApplication Templates

この記事は

  • rails newの後に毎回お決まりのgemを入れたり初期設定をするのが面倒だなと思っている方が対象です
  • 記事を読み終えると、自分でテンプレートを作ってお決まりの手順を自動化することができるようになります
  • とりあえずあとで読もう、という方はこちら => このエントリーをはてなブックマークに追加

はじめに

こんにちわ!クライアントワークチームの@hilotterです。

普段は主にRailsを使ったキャンペーンサイトの開発を行っています。

早速ですがみなさん rails new してますか?

Railsでアプリケーション開発を行う際にまず実行するのが rails new ですね。

ただ、rails newの後、すぐにアプリケーションコードの実装開始かというとそうではなくて、「テストのためにrspecを入れよう」とか、「unicornの設定をしよう」というように、開発を便利にしてくれる様々なgemをインストールしたり、gemの設定をする必要があります。

そのため「よしつくるぞ!」と思っても初期設定がなかなか大変で、これを毎回調べながらやっていると、本質的なアプリケーションコードの実装に入るまでにだいぶ時間がかかってしまいます。

初期設定ということは毎回お決まりの動作ということです。

そういうものは自動化してしまいましょう。

ご存知の方も多いと思いますが、Railsには「Application Templates」という仕組みが用意されていて、これを使うと rails new の際に自分で作成したレシピを取り込むことができます。

RSpecのインストールと初期設定を自動化してみる

ゴール

今回はサンプルとして

をApplicationTemplatesを使って自動化してみます。

rails.gif

今回つくるtemplateのディレクトリ構造は以下のようになります。

template
├── rspec_template.rb
└── spec
    └── support
        └── factory_girl.rb

1. templateファイルをつくる

まずはtemplateディレクトリ作成し、rspec_template.rb を追加します。

# rspec_template.rb

txt = <<-TXT

      _人人人人人人人人人人人人人人人_
      > Rails Application Templates <
       ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^YY^Y ̄

TXT
puts txt

# Gemfileに追加
gem_group :test, :development do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'simplecov' if yes?('use simplecov ?')
end

# rspec初期設定
run 'bundle install'
run 'rm -rf test'
generate 'rspec:install'

# factory_girl初期設定
uncomment_lines 'spec/rails_helper.rb', /Dir\[Rails\.root\.join/
get "~/{template へのパスを記述}/template/spec/support/factory_girl.rb", 'spec/support/factory_girl.rb'

続いて spec/support/factory_girl.rb も追加します。

# factory_girl.rb

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
  config.before(:all) do
      FactoryGirl.reload
  end
end

コードを見ていきましょう。

txtの部分は単にapplication templatesを使っているというのが分かるように書いているだけです。

Gemfileへの追記に関しては、gem_groupメソッドを使うと環境に応じたgemの記述を行うことができます。 gemメソッドを使うと対象のgemをGemfileに追加できます。 また、yes?メソッドはy(yes)が入力されるとtrueが返るので、「必要な時だけ○○を追加する」といった処理が可能になります。(no?メソッドもあります)

rspec初期設定に関しては、runメソッドで任意のコマンドを実行できます。 そして、generateメソッドで ./bin/rails generate コマンドを実行できます。 テンプレート内でrspec:installを行いたいのですが、デフォルトのbundle installはテンプレート内の処理が終わった後に実行されるため、テンプレート内で先にbundle installするようにしています。

最後にfactory_girl初期設定に関してですが、factory_girlの設定を直接 spec/rails_helper.rb に記述するのではなく、 spec/support ディレクトリ以下に個別ファイルを用意して設定するようにします。 spec/support ディレクトリはデフォルトではコメントアウトされているので、uncomment_linesメソッドでコメントアウトを解除します。 そして、getメソッドで spec/support/factory_girl.rb を templateディレクトリ内の spec/support/factory_girl.rb から取得するようにします。

これでテンプレートの完成です。

2. rails new時にtemplateを指定する

rails newの際にmオプションでテンプレートを指定します。

rails new myapp -m template/rspec_template.rb

myapp作成後、アプリを見てみるとテンプレートで追加した設定やファイルが作成されているのが確認できます。 bundle exec rspec でテストを実行できます。(まだ何もテストがない状態ですが)

これでRSpecのインストールと初期設定を自動化できました。

mオプションはローカル以外のファイルも指定できるので、テンプレートはgithubで管理して、rails new時にgithubのURLを指定するのがオススメです。

おまけ

Rails4.1をお使いであれば RailsApps/rails-composer を使ってみるの選択肢のひとつです。

rails new myapp -m https://raw.github.com/RailsApps/rails-composer/master/composer.rb

こちらは全部入りのレシピという感じで、

  • サーバは何を使うか?
  • DBは何を使うか
  • テンプレートは何を使うか?
  • デプロイはどうするか?

等の質問が表示されるので、それに答えていけば最初からカスタマイズされたrailsアプリケーションを作成することができます。

質問の量が結構あるので「これを毎回答えるのは大変だ」と思い、自分の場合は挫折しましたが、rails-composerでよく使う設定を生成して、それをテンプレートにまとめるというもいいかもしれませんね。

まとめ

最初のレシピを書くのは少し手間かもしれませんが、毎回使う設定をtemplateにまとめておけば、次回からはだいぶ楽になるのでぜひapplication templatesを使ってみてください。

hilotter/rails-application-template

に自分が普段良く使うテンプレートをあげています。

カヤックでは自動化好きなエンジニアを募集しています

とにかく自動化で楽がしたい。そんなエンジニアの方を絶賛募集中です。

社員と直接話せるイベント、1社だけの合同説明会を、1月17日(土)に渋谷ヒカリエで開催しますのでよろしければご参加ください!

さて明日は

js × スロット」作品を作り続ける漢。

クライアントワークHTMLファイ部期待のエース、 たじー がお送りします。お楽しみに!