Update(2011/3): 有網友問到底有哪些方法可以用,請參考 Rails::Generators::Actions 和 Thor::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-ruby 和 nokogiri 分別是 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.rb 和 dev.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 即可知。
SystemTimer is only relevant if you are running Ruby 1.8. You do not need it if you are running Ruby 1.9, JRuby, Rubinius or MacRuby.
Jinpu Hu: 感謝提醒,已更新。
请教下ihower,为什么 ActiveResource 没有用呢?
不是为REST提供很多帮助么?
To makestory:
自己用 HTTP client ihower.tw/blog/archives/2941 比較有彈性,ActiveResource 的 assumption 太多了。
I’m running Ruby 1.8 and SystemTimer is excellent.
SystemTimer is only relevant if you are running Ruby 1.8. You do not need it if you are running Ruby 1.9, JRuby, Rubinius or MacRuby.