{{ currentPost.title }}
{{ currentPost.datetime }}

What

zeus是rails的preloader,它可以讓rails指令跑的更快。

Why

時間寶貴,不解釋。

How

安裝

不建議使用bundle來裝它,因為透過bundle exec反而讓zeus啟動變慢。另外zeus本身就是設計不相依於rails專案,可以讓不同的專案用同一套zeus,所以可以直接下gem install zeus來安裝它。

使用

  • 1. 在rails專案中下指令zeus start,這時候會顯示zeus啟動的狀態與可以使用的指令。
  • 2. 開另一個console,就可以用zeus執行各種rails的指令。基本上就是在原本的rails指令前加上zeus,例如:zeus rails s
  • 3. 如果要關閉zeus,只要 ctrl + c 就可以了。
Zeus啟動的畫面
Zeus啟動的畫面

同場加映

  • 在 oh-my-zsh 中加入zeus的外掛,就可以使用縮寫下zeus的指令嘍。

會遇到的坑

首先第一個遇到的問題是無法使用 `zeus test` ,它會出現 `undefined method `configure' for RSpec:Module (NoMethodError)`

zeus test 無法使用
zeus test 無法使用
/Users/wangkaito/workspace/rails/dev/ukik-gamma2/spec/spec_helper.rb:19:in `': undefined method `configure' for RSpec:Module (NoMethodError)
from /Users/wangkaito/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:274:in `require'
from /Users/wangkaito/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:274:in `block in require'
from /Users/wangkaito/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:240:in `load_dependency'
from /Users/wangkaito/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:274:in `require'
from /Users/wangkaito/workspace/rails/dev/ukik-gamma2/spec/rails_helper.rb:6:in `'
from /Users/wangkaito/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:274:in `require'
from /Users/wangkaito/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:274:in `block in require'
from /Users/wangkaito/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:240:in `load_dependency'
from /Users/wangkaito/.rvm/gems/ruby-2.2.3/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:274:in `require'
from /Users/wangkaito/.rvm/gems/ruby-2.2.3/gems/zeus-0.15.4/lib/zeus/rails.rb:196:in `test_helper'
...

查了一下網路的資料發現因為zeus在啟動時,不會像rails一樣一次把所有用到的gem或是library都載入,所以如果有任何沒有require就使用的library的class或module就會出錯。上面的問題是出在 spec/rails_helper.rb 中的第6行:

require 'spec_helper'
require 'rspec/rails'

spec_helper裡有用到RSpec的module,但正真載入rspec的地方是在require 'rspec/rails',因此就出問題了。解法也很簡單,只要將上面兩行對掉就可以了。

require 'rspec/rails'
require 'spec_helper'

Spring?

其實rails預設有一個preloader叫做Spring,也是做類似的事。如果有興趣的話,可以看這篇的比較:Fast Tests: Comparing Zeus With Spring on Rails 4.1 and RSpec 3