こんにちは、 Advent Calendar が後半に近づくにつれ NoScheduleOnChristmasError が raise されそうな気配がただよってきましたが、上位クラスのどこでも rescue される気配はありません。
ぼくは浮気症な性格のため、 rails new
した回数はけっこう多いです。何回やっても「あれどうやるんだっけ」と調べている自分がいたので、いつもやってる新規プロジェクト立ち上げ手順をまとめてみます。
対象の読者
- Rails 開発をちょっとでもかじったことがある
- 近々
rails new
しようと目論んでいる
rails new
まずは何はともあれ rails new
をします。ただ、このコマンドをそのまま通すためにはシステムの gem として rails をインストールしなければなりません。 Ruby も Rails も開発が活発で、追従しているとたくさんのバージョンを半永久的にインストールし続けることになるため、 gem はできるだけ bundler 管理とし、 vendor/bundle に入れたいです。 システムのgemにrailsをインストールせずrails newする という記事を見つけたのでその手順に従ってやってみます。
$ mkdir project_name
$ cd project_name
$ bundle init
Writing new Gemfile to /path/to/project_name/Gemfile
のようにして Gemfile を生成し、下記のように編集します。 gem "rails"
のコメントを外すだけです。
# A sample Gemfile
source "https://rubygems.org"
gem "rails"
そしたら bundler 経由で rails をインストールするため、下記実行します。
$ bundle install --path vendor/bundle --without staging production --jobs=4
bundler は、設定したオプションを .bundle/config
に記録して覚えます。一度指定したら次からオプションをつけなくともついているものとして実行してくれますので、早い段階で覚えさせておきましょう。今は Gemfile に staging も production もありませんが、今後どうせ書くので without させ、 Bundlerで並列処理??bundle installを爆速で処理する方法。 に従って jobs も覚えさせておくことにします。
こんなファイルができています。
---
BUNDLE_PATH: vendor/bundle
BUNDLE_JOBS: 4
BUNDLE_WITHOUT: staging:production
BUNDLE_DISABLE_SHARED_GEMS: '1'
そしてようやく rails new
をしますが、普通にやってはいけません。 bundler でインストールしてシステムの gem 以外の場所に入ったコマンドを呼び出すには bundle exec
経由で実行します。
また、どうせ RSpec 使うし、標準からちょいちょい入れ替えたい gem もあるので、 Test::Unit を組み込まず(--skip-test-unit / -T
) bundle install もしない(--skip-bundle / -B
)ようにします。ちなみに他のオプションは bundle exec rails help new
で調べられますので、好みのある方は調べて指定すべきです。たとえばぼくは jQuery 新しいの使いたいので Javascript も組み込まず(--skip-javascript / -J
)下記のようにします。
Rails が Gemfile を作成しようとしますがすでに存在するとのことで上書きしていいか聞いてきますので上書きしてください。
$ bundle exec rails new . -BJT
:
:
conflict Gemfile
Overwrite /path/to/project_name/Gemfile? (enter "h" for help) [Ynaqdh] Y
ようやく rails new
の完了です。長かった……。ここから Gemfile や設定をイジっていきます。
Gemfile をイジって bundle install
テンプレートエンジン
ERB だと開発効率がちょっと……という感じなので、 haml か slim を使いたくないですか? 僕は haml 派なので Gemfile に下記追加します。
gem 'haml-rails'
ちなみに好みがあるかもしれませんが、僕は依存性は bundler がやってくれると信じて、バージョンアップの情報を都度 watch していない gem については bundle update したときに最新版になるよう、バージョンは指定しないことにしています。逆に、 rails みたいなものはアップデート情報を watch しているため、意図せずバージョンが変わらないように指定しています。
Rspec, FactoryGirl
よく rspec
と rspec-rails
両方書いている例を見かけますが、 rspec-rails は rspec に依存しているので両方書く必要はありません。
ハイフンとアンスコがむずくて何回やっても見ずに書けるようになりません。
gem 'rspec-rails'
gem 'factory_girl_rails'
そして RSpec まわりの初期設定をします。
$ bundle exec rails generate rspec:install
また、テストコードに FactoryGirl.create(:user)
と毎回書くのはダルいので、 FactoryGirl.
を省略して書けるように設定しておきます。
spec/rails_helper.rb
の RSpec.configure
ブロック内に下記追加します。
config.include FactoryGirl::Syntax::Methods
あ、そうそう、昔は spec_helper.rb だったのが RSpec3 から rails_helper.rb に分割されているので気をつけてください。
bundle install
あとは好みで Gemfile をいじっていき bundle install
をかまします。定番 gem などは、 1人Webサービス開発で使っているGemfileそのまま公開 - Qiita でいい感じに紹介してあり、使いたいものを使えばいいと思います。
generator
デフォルトの ERB ⇢ HAML, Test::Unit ⇢ RSpec, Fixture ⇢ FactoryGirl に入れ替えたわけなので、 rails generate
のときに正しく生成されるようにしたいです。また、 Javascript と CSS は最終的に自分で管理することが多いので僕はオフにしてます。
rails newしたらconfig.generatorsをまず設定しよう を参考に、たとえば下記のように設定します。
config.generators do |g|
g.javascripts false
g.stylesheets false
g.template_engine :haml
g.test_framework :rspec, view_specs: false, fixture: true
g.fixture_replacement :factory_girl, dir: 'spec/factories'
end
master ブランチにコミット
僕はこの段階で一旦 master ブランチにコミットします。 /vendor/bundle
を .gitignore
するのを忘れないようにしましょう。リポジトリが巨大になります。
$ bundle install
$ echo '/vendor/bundle' >> .gitignore
$ git init
$ git add .
$ git commit
終わりに
いかがでしたか?(って最近みんな記事の末尾に書く風潮がある気がするのでマネします)他にもこんなこと必要でしょとかここ間違えてるぞとかあればコメントで教えてください!