rake任務詳解

2021-08-30 18:40:40 字數 4986 閱讀 4000

[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...