iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 19
0
自我挑戰組

非本科之30天Ruby / Rails學習筆記系列 第 19

Day19: Rails中神奇的spring stop

Day19: Rails中神奇的spring stop

您有遇過rails g migration時卡住嗎?

您有rails sever打不開的問題嗎?

trivago

意外的查到的資料不多,所以這篇僅擷取Rails REARDME.md來簡單翻譯一下。

spring stop

常常在跑rail時,都會遇到一些很奇怪的狀況導致migration, rails sever, rails db:seed等跑不出來這狀況,但只要下了spring stop通常就解了?

Rails在4.1版本後新增了srping stop功能,來看看rails guide寫什麼:

Spring 會預加載你的 Rails 應用程式。保持應用程式在背景執行,如此一來在執行 Rails 命令時:如跑測試、rake、migrate 時,不用每次都重啟 Rails 應用程式,加速你的開發流程。

簡單來說就是應用程式預加載器,就像加速器一樣的概念。

spring stop的特性

  1. 在背景自動執行,只開啟終端機並進入rails資料夾就會自動執行
  2. 每次執行時重新載入你的rails專案中的code
  3. 當config、initializer、gem dependencies有更新時重新啟動

spring stop的運行

建立一個新的Rails專案並執行rails generate scaffold post name:string

打開終端機測試一下

$ time bin/rake test test/controllers/posts_controller_test.rb
Running via Spring preloader in process 2734
Run options:

# Running tests:

.......

Finished tests in 0.127245s, 55.0121 tests/s, 78.5887 assertions/s.

7 tests, 10 assertions, 0 failures, 0 errors, 0 skips

real    0m2.165s
user    0m0.281s
sys     0m0.066s

跑的速度不算特別快,因為是第一次執行這個專案,所以花的時間會比較長

來看一下spring的狀態:

$ bin/spring status
Spring is running:

26150 spring server | spring-demo-app | started 3 secs ago
26155 spring app    | spring-demo-app | started 3 secs ago | test mode

再跑一次就可以發現速度快很多:

$ time bin/rake test test/controllers/posts_controller_test.rb
Running via Spring preloader in process 8352
Run options:

# Running tests:

.......

Finished tests in 0.176896s, 39.5714 tests/s, 56.5305 assertions/s.

7 tests, 10 assertions, 0 failures, 0 errors, 0 skips

real    0m0.610s
user    0m0.276s
sys     0m0.059s

在coding時做的變更,會根據你在更新哪個檔案去判別是否要重新啟動後台。

舉例來說當我們修改application file或是test file時,相關的變更會再下一次執行時變更,你只需要重新刷瀏覽器,但後台系統不必重新啟動。

但當如果我們修改啟動應用程式所需的檔案,例如:configs, initializers, gemfile時,則後台需要重新啟動應用程式,而且會自動執行。

例如編輯config/application.rb

$ touch config/application.rb
$ bin/spring status
Spring is running:

26150 spring server | spring-demo-app | started 36 secs ago
26556 spring app    | spring-demo-app | started 1 sec ago | test mode

spring會偵測到config底下有檔案被更新後,就會自動啟動。


也許是spring的關係,所以常常會將我們不需要的東西先預載入到後台,導致我們在執行migration, rails s等會發生問題,所以才會需要下spring stop來終止預先載入的行為。

這只是我的推測...如果有錯的話歡迎指正。

參考資料:

Rails/spring/REARDME.md
Ruby on Rails 4.1 發佈記

“If you really want something, you have to be prepared to work very hard, take advantage of opportunity, and above all never give up.”

— Jane Goodall, Ethologist

本文同步發佈於: https://louiswuyj.tw/


上一篇
Day18: 淺談Rails的表單: form_with
下一篇
Day20: 簡易Rails實作(上)
系列文
非本科之30天Ruby / Rails學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言