- 更新日: 2016年1月19日
- Rails
RailsでSpringを導入して開発効率を上げる
Spring は Rails アプリケーションの preloader(プリローダー)の gem です。Rails アプリケーションをバックグラウンドで走らせたままにしておくことにより(pre + load = 前もってロードしておく)、bin/rails や bin/rake コマンドの2回目以降の起動時間が短縮されます。
— 環境 —
Mac OS X El Capitan 10.11.2
Rails 4.1.1
Ruby 2.1.2
bin/*** コマンド実行の時間短縮により、Rails アプリケーション開発効率の向上を期待できます。なお Spring は、Rails 4.1 以降は標準で付属されている。
Spring インストール
‘spring’ を Gemfile に書きます。Rails 4.1 以降であればデフォルトで記載されてあるはずです。4.1 未満のバージョンの場合で記載がなければ追記する。
また今回は、テストフレームワークに RSpec を使っていますので、Spring 対応の RSpec コマンド(bin/rspec)用の gem である ‘spring-commands-rspec’ も追記しました。不要ならこちらは記載しない。
Gemfile
1 2 3 4 |
group :development do gem 'spring' gem 'spring-commands-rspec' end |
インストール実行。
1 2 3 |
$ bundle install |
bin/spring, bin/rspec を生成するため、また bin/rails, bin/rake を Spring 対応に変換するために、以下のコマンドを実行します。
1 2 3 4 5 6 |
$ bundle exec spring binstub --all * bin/rake: spring inserted * bin/rspec: generated with spring * bin/rails: spring inserted |
これにより、bin/spring, bin/rspec が生成されるとともに、bin/rails, bin/rake に以下コードが追加されて、Spring 対応のコマンドと変換される。
1 2 3 4 5 |
begin load File.expand_path('../spring', __FILE__) rescue LoadError => e raise unless e.message.include?('spring') end |
Spring の使い方など
続いて Spring の使い方など。
bin/*** コマンド実行の2回目以降は、自動的に Spring が起動されて Rails アプリケーションがバックグラウンドで起動中となります。
Spring がバックグラウンドで起動中かどうかの状態を確認する。
Spring 停止中の場合。
1 2 3 4 |
$ bin/spring status Spring is not running. |
Spring 起動中の場合。
1 2 3 4 |
$ bin/spring status Spring is running: |
起動中の場合、stop で停止できる。
1 2 3 4 |
$ bin/spring stop Spring stopped. |
Spring 対応のコマンドを利用する場合…
1 2 3 |
$ bundle exec *** |
の代わりに
1 2 3 |
$ bin/*** |
のコマンドを使うようにします。このあたり bundle exec *** と bin/*** の違いについては、以下の Qiita 記事が詳しい。
Rails 4.1以降のコンソールコマンドは必ず bin/ を付けなきゃいけないの? – Qiita
Spring による実際のコマンド時間短縮を確認
続いて、Spring によって実際にコマンド起動が速くなることを確認してみます。
Spring が起動中の場合、前もっていったん停止しておく。
1 2 3 4 5 6 |
$ bin/spring stop Spring stopped. $ bin/spring status Spring is not running. |
例として Rails アプリケーションの概要を表示する、rake about コマンドを time コマンドで計測してみる。
まずは Spring 停止中の場合。
1 2 3 4 5 6 |
$ /usr/bin/time bin/rake about Running via Spring preloader in process 38266 ... 16.24 real 0.19 user 0.07 sys |
/usr/bin/time としているのは、自分が zsh ユーザーなので単に time と打つと、zsh の time コマンドが使われるため。詳しくは以下。
1回目のコマンド実行の後、Spring のステータスを確認してみますと…
1 2 3 4 |
$ bin/spring status Spring is running: |
Spring が起動中になっていることを確認できる。つまり、2回目以降の bin/*** コマンドでは Spring が起動中でなので、コマンド実行の時間短縮を期待できます。
2回目を実行。
1 2 3 4 5 6 |
$ /usr/bin/time bin/rake about Running via Spring preloader in process 38416 ... 1.44 real 0.17 user 0.06 sys |
real が16秒から約1.4秒と10倍以上速くなりました。Spring すごい。
続いて、RSpec の request spec テストを実行してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ bin/spring stop Spring stopped. $ bin/spring status Spring is not running. $ /usr/bin/time bin/rspec spec/requests/user_pages_spec.rb Running via Spring preloader in process 38925 ... 51.78 real 0.18 user 0.07 sys $ bin/spring status Spring is running: $ /usr/bin/time bin/rspec spec/requests/user_pages_spec.rb Running via Spring preloader in process 39121 ... 37.66 real 0.22 user 0.12 sys |
こちらも real が51秒から37秒へと、14秒ほど短縮されました。Spring によるコマンド起動時間の短縮は目を見張るものがありますね。
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!