[color=blue][size=medium][b]rake簡介[/b][/size][/color]
[b]rake是啥子?[/b]
rake的意思是ruby make,乙個用ruby開發的**構建工具.
[b]但是,為什麼ruby需要rake?[/b]
按理說ruby**無需編譯,應該不需要rake才對呀?原來,rake另有妙用,即把rake當做乙個任務管理工具來使用...這樣做有兩個好處:
1.以任務的方式建立和執行指令碼
當然,你可以用指令碼來建立每乙個你希望自動執行的任務.但是,對於大型的應用來說,你幾乎總是需要為資料庫遷移(比如rails中db:migrate任務)、清空快取、或者**維護等等編寫指令碼.對於每一項任務,你可能都需要寫若干指令碼,這會讓你的管理變得複雜.那麼,把它們用任務的方式整理到一起,會讓管理變得輕鬆很多.
2.追蹤和管理任務之間的依賴
rake還提供了輕鬆管理任務之間依賴的方式.比如,"migrate"任務和"schema:dump"任務都依賴於 "connect_to_database"任務,那麼在"migrate"任務呼叫之前,"connect_to_database"任務都會被執行.
下面入正題吧,即如何用rake編寫乙個任務指令碼..
[color=blue][size=medium][b]rake指令碼編寫[/b][/size][/color]
先來個簡單的例子,如下:
假設你是乙個火星成員,老版本那些,即如燕兒虎跑之類的,在週末你打算去車車那邊打火鍋,然後集體pc去.對應這個情況,你需要為自己制定三個任務:搭車找車車、烤魚和網咖pc.用vim建立建立乙個名叫rakefile的檔案(備註:rake會在當前路徑下尋找名叫rakefile、rakefile、rakefile.rb和rakefile.rb的rake檔案),並鍵入如下**:
desc "任務1 -- 搭車去車車那裡"#這據說是個苦差,因為太遠了
task :busboy do
puts "發現挫男"
enddesc "任務2 -- 烤魚"
task :*****fish do
puts "老闆,先烤九斤魚"
enddesc "任務3 -- 網咖pc"
task :pc do
puts "我選中路"
end
開啟命令列工具,進入這個檔案所在目錄,然後執行下面的命令,大致應該類似如下結果:
d:\work>rake busboy
(in d:/work)
發現挫男
d:\work>rake *****fish
(in d:/work)
老闆,先烤九斤魚
d:\work\ruby_works\ruby_book>rake laundry
(in d:/work)
我選中路
(備註:文字部分是沒啥邏輯的,純粹娛樂下...)
[b]分析[/b]
相信看完上面那段東東,你已經知道怎麼搞了...現在介紹些基礎知識,方便加深理解.從上面的**可以知道,此檔案一共定義了3個任務,desc是rake定義的方法,表示對下面定義任務的描述.這個描述會在使用rake --tasks(或者rake -t)命令時輸出在螢幕上.
d:\work>rake --tasks
(in d:/work)
rake *****fish #任務2 -- 烤魚
rake busboy #任務1 -- 搭車去車車那裡(這據說是個苦差,因為太遠了)
rake pc 任務3 -- 網咖pc
task是rake最重要的方法.它的方法定義是:task(args, &block).任務體是乙個block,本例中只是簡單輸出你所要做的工作.需要注意的是**
puts "發現挫男"
完全是乙個普通的ruby語句,puts是ruby中進行輸出的一般性方法,可以看出,rake任務可以完全使用ruby的能力,這使得它非常強大.
go..go..go..go..
接下來介紹下:依賴關係和命名空間
[b]加入依賴關係[/b]
很顯然,在我們定義的任務中,"烤魚"是依賴於"搭車去車車那裡"的(其它地方有沒烤魚吃不知道,反正地點就定在那了).那麼,我們需要在我們的任務定義中加入這個依賴關係,修改後的檔案如下:
desc "任務1 -- 搭車去車車那裡"
task :busboy do
puts "發現挫男"
enddesc "任務2 -- 烤魚"
task :*****fish => :busboy do
puts "老闆,先烤九斤魚"
enddesc "任務3 -- 網咖pc"
task :pc do
puts "我選中路"
end
再次執行烤魚任務,你會得到如下結果:
d:\work>rake *****fish
(in d:/work)
發現挫男
老闆,先烤九斤魚
[b]命名空間[/b]
跟任何程式語言類似,當你的rake檔案很多時,當你有很多任務的時候,你需要關注它們的命名衝突問題,命名空間(namespace)就是乙個自然的解決方案.你可以為上面的三個任務定義乙個叫做dan的命名空間.
namespace :dan do
desc "任務1 -- 搭車去車車那裡"
task :busboy do
puts "發現挫男"
end……
end
再次執行rake --tasks,你會得到如下的結果:
d:\work >rake --tasks
(in d:/work)
rake dan:*****fish # 任務2 -- 烤魚
rake dan:pc # 任務3 -- 網咖pc
rake dan:busboy # 任務1 -- 搭車去車車那裡
你現在需要使用rake dan:*****fish才能啟動烤魚這個任務了.
(btw,你可以在你的rakefile中使用多個命名空間,對任務進行分類.)
了解了上面兩個知識點後,我們來了解下兩個具體例項:
[b]在乙個任務中呼叫另外乙個任務[/b]
當任務眾多的時候,你很可能需要在乙個任務中呼叫另外乙個任務,假設我們把今天所有要做的工作定義為乙個任務:today.在這個任務中,有兩個任務需要被呼叫,乙個是烤魚,乙個是網咖pc.當然,由於烤魚依賴於搭車去車車那裡,我們還是需要搭車去車車那裡的.在檔案的頂部定義乙個today的任務:
desc "今天的任務"
task :today do
rake::task["dan:*****fish"].invoke
rake::task["dan:pc"].invoke
endnamespace :dan do
……end
可以看出,呼叫其它任務的方式很簡單,只需要呼叫
rake::task["task_name"].invoke
方法就可以了.在命令列中啟動rake today,可以得到:
d:\work >rake today
(in d:/work)
發現挫男
老闆,先烤九斤魚
我選中路
[b]預設任務[/b]
可以為rake增加乙個預設任務,這樣可以簡單地用rake命令來觸發這個預設任務,在上面的rakefile中,我們可以用如下方式把"today"任務作為預設任務.
task :default => [:today]
然後呼叫直接在命令列中呼叫rake,可以得到跟呼叫rake today同樣的輸出結果.
這就是我們簡單的乙個rake任務定義,下面是完整的修改後的rakefile:
task :default => [:today]
desc "今天的任務"
task :today do
rake::task["dan:*****fish"].invoke
rake::task["dan:pc"].invoke
endnamesoace :dan do
desc "任務1 -- 搭車去車車那裡(這據說是個苦差,因為太遠了)"
task :busboy do
puts "發現挫男"
enddesc "任務2 -- 烤魚"
task :*****fish do
puts "老闆,先烤九斤魚"
enddesc "任務3 -- 網咖pc"
task :pc do
puts "我選中路"
endend
看完上面兩個例子,估計rake任務就算全部了解了...其它都是些**槍花罷了..多耍便是..
來看看我們的rails原始碼吧...
[b]rails中的rake任務[/b]
rails預定義了大量的rake任務,在rails應用的開發過程中,你想必已經在大量使用它們了.在rails中,所有的rake任務都放在rails目錄的lib/tasks目錄下(在作者的環境下是c:\ruby\lib\ruby\gems\1.8\gems\rails-2.3.5\lib\tasks),所有的rake任務都以.rake作為字尾名,這些以.rake結尾的檔案會被自動載入到你的環境中.你可以到乙個已有的rails工程根目錄下鍵入rake --tasks,可以看到很多的rake任務已經為你整裝待發了.
[size=medium][color=blue](對於上面資料夾裡的*.rake任務經過上面的解析,相信要看懂應該不難了...自己看著辦吧.)[/color][/size]
詩歌rails之自定義Rake任務
我們經常用rake db migrate來做資料庫遷移 我們還可以使用rake t來列出可得到的rake任務 讓我們在store這個rails程式中建立乙個自己的rake任務 我們建立store lib tasks ryanb.rake ruby task greet do puts hello w...
rake是什麼與rake命令簡介
rake 是一門構建語言,和make www.gnu.org software make ant 很想象。rake是用ruby寫的,它支援它自己的dsl用來處理和維護 ruby應用程式。rails用rake的擴充套件來完成多種不同的任務。下面的一些在rails用的最多的rake任務。可以通過在你的r...
主題 rake是什麼與rake命令簡介
rake 是一門構建語言,和make www.gnu.org software make ant 很想象。rake是用ruby寫的,它支援它自己的dsl用來處理和維護 ruby應用程式。rails用rake的擴充套件來完成多種不同的任務。下面的一些在rails用的最多的rake任務。可以通過在你的r...