我的 Rails3 App Template (+JQuery+RSpec+Watchr)

Update(2011/3): 有網友問到底有哪些方法可以用,請參考 Rails::Generators::ActionsThor::Actions

Rails 的 App Template 功能可以快速初始化一個客製化的 Rails 專案,例如,如果你想使用我的特製版本,只要一行指令就可以產生出特製的 Rails3 專案:

git clone git://github.com/ihower/rails3-app-template.git
rails new your_project_name -TJ -d mysql -m rails3-app-template/rails3.rb

其中 -TJ 的意思是省略 prototype.js 和 test-unit 檔案的產生(我會用 JQuery 和 RSpec 取代),-d 的意思是使用 MySQL 設定。

接下來讓我來介紹一下 rails3-app-template/rails3.rb 在做什麼? 這些是我目前初始一個專案的必備初始動作,也非常推薦給你使用。

# remove files
run "rm README"
run "rm public/index.html"
run "rm public/images/rails.png"
run "cp config/database.yml config/database.yml.example"

這幾個檔案沒有用。真正的 config/database.yml 並不會 commit 出去,我們待會會設定 .gitignore 忽略它。這裡複製一份 database.yml.example 用來當範例 commit 出去。

run "rm Gemfile"
file 'Gemfile', File.read("#{File.dirname(rails_template)}/Gemfile")

拷貝一份 Gemfile。這些是我基本會用的 gems (一些常用的我也註解列進去了),yaji-rubynokogiri 分別是 JSON 和 XML Parser,mysql2 是新版的 MySQL Driver,而 kaminari 是才剛新推出的分頁工具 (will_paginate 好像要退休了)。其他 gem 都是寫測試程式用的。

run "bundle install"

執行 bundle install 安裝以上這些 gem。

# generate rspec
generate "rspec:install"

產生 RSpec 必要檔案,RSpec 是 Rubyist 們最愛的測試框架。

# copy files
file 'script/watchr.rb', File.read("#{File.dirname(rails_template)}/watchr.rb")
file 'lib/tasks/dev.rake', File.read("#{File.dirname(rails_template)}/dev.rake")

複製 watchr.rbdev.rake 這兩個檔案。Watchr 我等會會介紹,dev.rake 則是我慣用的 rake 指令。

# remove active_resource and test_unit
gsub_file 'config/application.rb', /require 'rails\/all'/, <<-CODE
  require 'rails'
  require 'active_record/railtie'
  require 'action_controller/railtie'
  require 'action_mailer/railtie'
CODE

移除 active_resource 和 test_unit 的載入,沒有用。

# install jquery
run "curl -L http://code.jquery.com/jquery.min.js > public/javascripts/jquery.js"
run "curl -L http://github.com/rails/jquery-ujs/raw/master/src/rails.js > public/javascripts/rails.js"
 
gsub_file 'config/application.rb', /(config.action_view.javascript_expansions.*)/, 
                                   "config.action_view.javascript_expansions[:defaults] = %w(jquery rails)"

下載最新的 JQuery 和 Rails 的 JQuery adapter

# add time format
environment 'Time::DATE_FORMATS.merge!(:default => "%Y/%m/%d %I:%M %p", :ymd => "%Y/%m/%d")'

新增一個預設的 Time format,方便 Time#to_s。

# .gitignore
append_file '.gitignore', <<-CODE
config/database.yml
Thumbs.db
.DS_Store
tmp/*
coverage/*
CODE

這些檔案不會 commit 出去。

# keep tmp and log
run "touch tmp/.gitkeep"
run "touch log/.gitkeep"

這兩個目錄最好 commit 出去 (這是因為如果目錄下沒有檔案,Git 就不會 commit 這個目錄)

# git commit
git :init
git :add => '.'
git :add => 'tmp/.gitkeep -f'
git :add => 'log/.gitkeep -f'
git :commit => "-a -m 'initial commit'"

最後 commit 出去。

Watchr

每次修改檔案完需要做測試,如果都要手動打 rspec spec 實在太累了。Watchr 就是這樣的工具可以自動監控哪個檔案你剛修改存檔,然後自動跑對應的測試 (這只是其中一個用途而已)。這樣自動跑測試的流程,又叫做 “Continuous Testing“。之前還有一套 Autotest,不過相較起來 Watchr 更為優良。

要怎麼執行呢?

bundle exec watchr script/watchr.rb # 或 rake dev:watchr

Watchr script 很簡單,你可以參考看看 watchr.rb 即可知。

參與討論

8 則留言

  1. 请教下ihower,为什么 ActiveResource 没有用呢?
    不是为REST提供很多帮助么?

發佈留言

發表迴響