下面是咱們使用Rake任務的例子:
一、給列表中的用戶發送郵件
二、每晚數據的計算和報告
三、過時或從新生成緩存
四、備份數據和svn版本(how's this : subversion repository)
五、運行數據處理腳本(sort of,how much is called this )
六、Pouring drinks to get a good buzz on(一句玩笑,是這兩位仁兄的風格)
這篇文章中,咱們將討論爲何要建立Rake,和他怎麼樣幫助咱們的rails應用。最好你能夠寫本身的Rake。
1、歷史回顧:make
爲了瞭解Rake的來歷,咱們先了解一下Rake的爺爺:Make。
讓咱們回到那個代碼塊須要編譯,解釋性語言和iphone還沒出如今地球上的時代。
回到那時,咱們下載的大型程序,仍是一堆源代碼和一個shell腳本。這個shell腳本包含了全部須要用來compile/link/build的代 碼。你須要運行「install_me.sh」這個腳本,每一行代碼將被運行(編譯每一行源文件),而後生成一個你可以運行的文件。
對於大多數人這樣是不錯的,可是對於程序開發人員倒是一個不幸。每次你對源代碼進行一個小的改動,並進行測試的時候,你須要回到shell腳本,並從新編譯全部的源代碼,顯然對於大的程序「那是至關的」耗時的。
1977年,貝爾實驗室的Stuart Feldman創造了「make」。解決了編譯時間過長的問題。Make用來編譯程序,取得兩方面的進步:
Stuart Feldman
(1)Make能夠發現哪一個文件在上一次編譯後改動過,根據這點,再次運行Make時,僅編譯改動過的文件。這個很大程序上減小了從新編譯大型程序的時間。
(2)Make能夠進行從屬跟蹤。你能夠告訴編譯器,源文件A的編譯須要源文件B,源文件B的編譯須要源文件C,因此Make在編譯A時發現B沒有編譯,將會先編譯B。
能夠這樣定義:Make是一個可執行程序。像ls或dir同樣。讓Make理解如何讓編譯一個項目,須要建立一個makefile文件,描述全部的源文件和依賴關係。makefiles有本身的語法,你不用去了解。
這些年Make出現了其餘的變體,而且被其餘的語言使用。事實上,ruby用戶在rake出現前也在使用它。
「可是,ruby並不須要編譯,咱們用它來幹嗎?」
是啊。ruby是一個解釋性語言,咱們不須要編譯它的源代碼,因此ruby程序員爲何使用它呢?
兩個重要的緣由:
(1)建立任務
在大型的應用中,你常常編寫腳本,在命令行下運行一些任務。好比清除緩存,維護任務,或者遷移數據庫。你能夠寫一個MakeFile來組織你的任務,而不是寫十個不相干的腳本(或者一個複雜的)。這樣你能夠簡單的運行:「make stupid」。
(2)從屬任務跟蹤
當你開始寫一些維護任務的時候,可能發現有些任務的使用可能有重複。好比,「migrate」任務和「schema:dump」都須要連接數據庫,這樣我 能夠建立一個任務"connect_to_database",使「migrate」和「schema:dump」都依賴 於"connect_to_database",這樣下次運行「migrate」時,"connect_to_database"會先於 「migrate」運行
2、如何獲得Rake
幾年前,Jim Weirich在一個java項目上使用了Make,他發現若是在他的Makefile中寫一小段ruby代碼將會帶來很是大的方便。因此他建立了Rake。
Jim 爲Rake建立了任務功能,附屬關係跟蹤,甚至建立了時間段判斷(timestamp recognition),(在上一次編譯的基礎上僅編譯改動的部分),固然,對於ruby,咱們並不須要編譯。
我很想知道Jim在代碼裏作了什麼,你也想知道吧。Jim可能歷來沒想給這個代碼寫個文檔,可能如今他也是被煩透了,寫了一個。呵呵
3、Rake如何工做
開始我想給這個部分起名爲"How to get wasted with Rake"。
那麼我想喝點酒,該怎麼作呢?
一、去買酒
二、喝酒
三、喝醉
若是我要使用Rake完成這個任務,我會建立一個「Rakefile」文件:
task :purchaseAlcohol do
puts "Purchased Vodka"
end
task :mixDrink do
puts "Mixed Fuzzy Navel"
end
task :getSmashed do
puts "Dood, everthing's blurry, can I halff noth'r drinnnk?"
end 這樣我能夠在這個Rakefile的目錄,分別運行這些任務:
$ rake purchaseAlcohol
Purchased Vodka
$ rake mixDrink
Mixed Fuzzy Navel
$ rake getSmashed
Dood, everthing's blurry, can I halff noth'r drinnnk? 酷!可是從順序上看,我能夠用任何的順序運行這個任務。好比喝醉在買酒或者喝酒以前。固然這不符合人的習慣。
4、Rake的順序
task :purchaseAlcohol do
puts "Purchased Vodka"
end
task :mixDrink => :purchaseAlcohol do
puts "Mixed Fuzzy Navel"
end
task :getSmashed => :mixDrink do
puts "Dood, everthing's blurry, can I halff noth'r drinnnk?"
end 這樣,若是想喝酒,就得先去買,若是想喝醉,就得先喝酒。
$ rake purchaseAlcohol
Purchased Vodka
$ rake mixDrink
Purchased Vodka
Mixed Fuzzy Navel
$ rake getSmashed
Purchased Vodka
Mixed Fuzzy Navel
Dood, everthing's blurry, can I halff noth'r drinnnk? 看到了吧,我喝醉和,由於酒已經買了,也被我喝了。(譯者:我是喜歡百事的,因此假若我寫,定然拿百事當例子。可是我讓我兒子和可口,爲何呢?下面告訴你。)
如今,你的慾望沒法知足了,你想讓你的朋友加入進來。就像一個團隊的開發,若是你想加入一個新人,你得有合適的規劃。你得有文檔。那麼問題來了。
5、如何給個人Rake添加文檔
Rake添加文檔很是的方便,使用「desc」就能夠了:
desc "This task will purchase your Vodka"
task :purchaseAlcohol do
puts "Purchased Vodka"
end
desc "This task will mix a good cocktail"
task :mixDrink => :purchaseAlcohol do
puts "Mixed Fuzzy Navel"
end
desc "This task will drink one too many"
task :getSmashed => :mixDrink do
puts "Dood, everthing's blurry, can I halff noth'r drinnnk?"
end 看到了吧,個人每一個任務都添加了desc,這樣咱們能夠輸入"rake -T"或者"rake --tasks":
$rake --tasks
rake getSmashed # This task will drink one too many
rake mixDrink # This task will mix a good cocktail
rake purchaseAlcohol # This task will purchase your Vodka 簡單乎?呵呵
6、Rake的命名空間
當你開始酗酒,而且開始使用大量的rake任務的時候,你須要一個好方法將他們分類,這時用到了命名空間,若是我在上面的例子使用了命名空間,那麼:
namespace :alcoholic do
desc "This task will purchase your Vodka"
task :purchaseAlcohol do
puts "Purchased Vodka"
end
desc "This task will mix a good cocktail"
task :mixDrink => :purchaseAlcohol do
puts "Mixed Fuzzy Navel"
end
desc "This task will drink one too many"
task :getSmashed => :mixDrink do
puts "Dood, everthing's blurry, can I halff noth'r drinnnk?"
end
end 命名空間容許你將一些任務放到特定的分類中,在一個Rakefile中,你能夠加入幾個命名空間。運行rake --tasks
rake alcoholic:getSmashed # This task will drink one too many
rake alcoholic:mixDrink # This task will mix a good cocktail
rake alcoholic:purchaseAlcohol # This task will purchase your Vodka 因此若是想運行這個任務,只要輸入 rake alcoholic:getSmashed:
7、如何寫一個有用的ruby任務
最近,我想用ruby建立幾個文件夾:
desc "Create blank directories if they don't already exist"
task(:create_directories) do
# The folders I need to create
shared_folders = ["icons","images","groups"]
for folder in shared_folders
# Check to see if it exists
if File.exists?(folder)
puts "#{folder} exists"
else
puts "#{folder} doesn't exist so we're creating"
Dir.mkdir "#{folder}"
end
end
end 固然,還能夠在rake中使用更多的 文件工具File Utils,或者加入其餘的部分。
8、如何爲個人rails應用寫一個Rake任務
一個rails應用中,已經有了一些rake任務,你能夠在你的項目目錄裏運行:rake --tasks。
爲了給你的rails應用添加一個新的任務,你能夠打開/lib/tasks目錄(已經存在的),添加一個叫something.rake的文件,這個任務會被自動的檢索到,這些任務會被添加到rake tasks列表中,你能夠在根目錄裏運行他們,如今把咱們上面的例子放到這個rails應用中。html