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

Rails Webook

自社のECを開発している会社で働いています。Rails情報やサービスを成長させる方法を書いていきます

Railsの開発効率をあげる - Springを使ってRailsのコンソールコマンドの実行を早くする

開発を効率化する Rails gem

Springとは

Springとは、Rails4.1から標準で付属するようになったアプリケーションプリローダーです。
Rails内では様々なライブラリのロードなどの前処理が行われるので、コマンドを実行するための待ち時間がかかってしまいます。
事前にバックグラウンドでライブラリをロードしておくことで、その待ち時間を短くするものがアプリケーションプリローダーです。

MiniTestやRSpecをrakeコマンドで実行したり、サーバー起動やconsoleをrailsコマンドで実行すると思いますが、動き出すまで数秒かかると思います。
開発を通すとこういったコマンドは、何十回、何百回も実行することになるので、数秒でも早いにこしたことはありません。

他の有名なアプリケーションプリローダーには、SporkZeusといったものもあります。

Spring導入前

Springを使わないでテストを実行してみます。
realが5秒程度かかっています。

$ time bin/rake test
.......

7 runs, 13 assertions, 0 failures, 0 errors, 0 skips

real  0m5.213s
user  0m0.825s
sys 0m0.379s

Spring導入後

今度はSpringを使ってテストを実行します。
realの値が5秒から2秒になっています。
まだ、依存するライブラリが少ないですが、プロジェクトが大きくなるにつれてSpringの恩恵は増えてくると思います。

$ time bin/rake test
.......

7 runs, 13 assertions, 0 failures, 0 errors, 0 skips

real  0m1.980s
user  0m0.852s
sys 0m0.394s

対象読者

  • Railsの開発効率を上げたい方(特に、rake, railsコマンドを良く使う方)

動作確認

  • Ruby 2.0
  • Rails 4.1
  • Spring 1.1.3

Springの動作要件

  • Ruby 1.9.3, 2.0, 2.1
  • Rails 3.2, 4.0, 4.1 (default)
  • Process.forkを使っているのでWindows, JRuby環境はだめ

目次

  1. Railsプロジェクトを作成
  2. Springをインストール
  3. Springの使い方
  4. Springのコマンドを追加(RSpec, Cucumperなど)
  5. Springの削除

1. Railsプロジェクトを作成

まずはRailsプロジェクトを作成します。

rails new spring_test
cd spring_test

次にSpringの挙動を確認するために、UserをScaffoldで作成します。

rails g scaffold User firstname:string lastname:string email:string
rake db:migrate

2. Springをインストール

では、さっそくRailsにSpringをインストールしていきましょう。

Rails 4.1ではデフォルトで入っているので、Gemfileに記載されていることを確認します。
Rails 3.2や4.0の場合や、Springがコメントアウトされている場合は、次のように記載してください。

# Gemfile

# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring',        group: :development

Bundlerでgemをインストールします。

bundle install

そして、Railsプロジェクトのルートのbin/springという実行ファイルを作成します。

bundle exec spring binstub --all

これにより、bin/railsbin/rakeに次のようなコードも追加されます。

begin
  load File.expand_path("../spring", __FILE__)
rescue LoadError
end

3. Springの使い方

Springがバックグラウンドで起動しているか確認します。
Spring is not running.であることを確認します。止まっていない場合は、bin/spring stopで停止できます。

$ bin/spring status
Spring is not running.

では、テストを実行してみましょう。
rakeやrailsコマンドの最初の実行時にはSpringが起動していないため実行は早くありません。
realが5秒程度かかっています。

$ time bin/rake test
Run options: --seed 59255

# Running:

.......

Finished in 0.855353s, 8.1838 runs/s, 15.1984 assertions/s.

7 runs, 13 assertions, 0 failures, 0 errors, 0 skips

real  0m5.213s
user  0m0.825s
sys 0m0.379s

またbin/spring statusを実行すると、Springが起動しています。

$ bin/spring status
Spring is running:

41751 spring server | spring_test | started 22 secs ago
41752 spring app    | spring_test | started 22 secs ago | test mode

では、またテストを実行してみましょう。
realの値が5秒から2秒になっています。
まだ、依存するライブラリが少ないですが、プロジェクトが大きくなるにつれてSpringの恩恵は増えてくると思います。

$ time bin/rake test
Run options: --seed 32264

# Running:

.......

Finished in 0.172552s, 40.5675 runs/s, 75.3396 assertions/s.

7 runs, 13 assertions, 0 failures, 0 errors, 0 skips

real  0m1.980s
user  0m0.852s
sys 0m0.394s


4. Springのコマンドを追加(RSpec, Cucumperなど)

Springにrspeccucumberなどコマンドを追加できます。
方法は同じなので、RSpecコマンドを追加してみましょう。

まず、GemfileにGemを追加します。

# Gemfile

gem "spring-commands-rspec", group: :development

そして、Bundlerを実行します。

bundle install

Springを停止します。

bin/spring stop

bin/rspecコマンドを追加します。

spring binstub --all
* bin/rake: spring already present
* bin/rspec: generated with spring
* bin/rails: spring already present

今はRSpecが入っていないので実行できませんが、次のように実行します。

bin/rspec

他には、以下のようなSpringのGemがあります。
上記のGemfileの内容を書き換えるとそのコマンドを追加できます。

  • spring-commands-rspec
  • spring-commands-cucumber
  • spring-commands-spinach
  • spring-commands-testunit
  • spring-commands-teaspoon

5. Springの削除

Springをプロジェクトから削除する方法です。

bin/からSpringの実行ファイルを削除します。

$ bin/spring binstub --remove --all

次にGemfileからSprignを削除します。

# Gemfile

# 下記2行を削除かコメントアウト
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
# gem 'spring',        group: :development

そして、Bundlerを実行します。

$ bundle install

以上です。
Springを使うことで、コマンド実行の待ち時間が減り開発効率も上がることでしょう。
そのほかにも、guardというファイルの変更を検知し、自動でRSpecやRuboCopの実行、ブラウザの更新を行ってくれるGemもあります。
今日ものある場合は下記からインストール方法や使い方がわかります。

参考文献