Ruby中任務構建工具rake的入門

不一樣的rake文件當中不要定義重名的方法,否則無法調用數據庫

 

參考:http://www.jb51.net/article/81476.htm編程

Rake簡介vim

Rake的意思是Ruby Make,一個用ruby開發的代碼構建工具.緩存

可是,爲何Ruby須要Rake?ruby

    按理說Ruby代碼無需編譯,應該不須要Rake纔對呀?原來,Rake另有妙用,即把Rake當作一個任務管理工具來使用...這樣作有兩個好處:bash

1.以任務的方式建立和運行腳本編程語言

   固然,你能夠用腳原本建立每個你但願自動運行的任務.可是,對於大型的應用來講,你幾乎老是須要爲數據庫遷移(好比Rails中db:migrate任務)、清空緩存、或者代碼維護等等編寫腳本.對於每一項任務,你可能都須要寫若干腳本,這會讓你的管理變得複雜.那麼,把它們用任務的方式整理到一塊兒,會讓管理變得輕鬆不少.工具

2.追蹤和管理任務之間的依賴spa

Rake還提供了輕鬆管理任務之間依賴的方式.好比,"migrate"任務和"schema:dump"任務都依賴於 "connect_to_database"任務,那麼在"migrate"任務調用以前,"connect_to_database"任務都會被執行..net

下面入正題吧,即如何用Rake編寫一個任務腳本..

順序執行

在Rake中定義任務後,能夠指定任務的執行順序,例如,天天早晨起牀後的例行公事:
1. 關閉鬧鐘
2. 梳洗打扮
3. 泡杯咖啡
4. 遛狗
上面的幾項事物,在Rakefile中這樣描述

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
task :turn_off_alarm do
  puts "Turned off alarm. Would have liked 5 more minutes, though."
end
 
task :groom_myself do
  puts "Brushed teeth."
  puts "Showered."
  puts "Shaved."
end
 
task :make_coffee do
  cups = ENV [ "COFFEE_CUPS" ] || 2
  puts "Made #{cups} cups of coffee. Shakes are gone."
end
 
task :walk_dog do
  puts "Dog walked."
end
 
task :ready_for_the_day => [ :turn_off_alarm , :groom_myself , :make_coffee , :walk_dog ] do
  puts "Ready for the day!"
end


經過rake ready_for_the_day來執行任務,而後你就能夠看到,全部的task都在按照你預約的順序在執行。

?
1
2
3
4
5
6
7
Turned off alarm. Would have liked 5 more minutes, though.
Brushed teeth.
Showered.
Shaved.
Made 5 cups of coffee. Shakes are gone.
Dog walked.
Ready for the day!


此外還能夠用過rake make_coffee COFFEE_CUPS=5這樣在命令中給變量賦值。

命名空間

上面那樣定義任務沒有問題,但若是你須要另外定義些事物,好比工做相關的,交通相關的,這時候全部的任務混雜到一塊兒顯然就不合適了,畢竟上面那些任務只是咱們起牀的例行事物,與其它無關。

經過namespace能夠幫助咱們定義出Rails中相似rake db:migrate的任務,描畫出事物間清晰的邊界,將上面的任務包括在namespace的一個代碼塊中,以下

?
1
2
3
4
namespace :morning do
  task :turn_of_alarm
  ....
end


這一次咱們的調用命令就須要稍微作出些許變化,rake COFFEE_CUPS=3 morning:ready_for_the_day。 是否是跟rails中的rake任務調用方式很像呢?

默認Task

有了上面那些設置,若是咱們忘記或者不想寫詳細的任務名稱,直接執行rake會有什麼效果呢,結果是rake aborted!,任務被中斷的報錯。既然有這樣的可能性,咱們就須要消除這些隱患,經過設置default默認任務就能夠作到,以下:

?
1
task :default => 'morning:turn_off_alarm'


當你直接執行rake命令時,會執行默認操做,幫咱們關閉鬧鐘。

描述你的Task

當任務漸漸變多之後,管理問題就暴露出來了,除了命名空間之外,咱們還須要文檔類的支持,幫助咱們梳理任務並顯示的告訴咱們每一個任務的目的和功能,這時你能夠試一試用desc描述任務。

?
1
2
3
4
5
6
7
...
desc "Make coffee"
task :make_coffee do
  cups = ENV [ "COFFEE_CUPS" ] || 2
  puts "Made #{cups} cups of coffee. Shakes are gone."
end
...


上面的描述不只能夠在文檔中查看,同時使用rake -T也能清洗的瞭解到每一個任務是作什麼的。rake -T的輸出結果是按照字母順序排的序。

?
1
rake morning :make_coffee    # Make coffee


調取Task

Rake還容許在不一樣任務之間互相調用,例以下面的代碼,你想在下午也來杯咖啡,不用重複定義,直接使用上午的泡法,來一杯便可。

?
1
2
3
4
5
6
namespace :afternoon do
   task :make_coffee do
    Rake::Task[ 'morning:make_coffee' ].invoke
    puts "Ready for the rest of the day!"
   end
  end


Rake腳本編寫

先來個簡單的例子,以下:

假設你是一個火星成員,老版本那些,即如燕兒虎跑之類的,在週末你打算去車車那邊打火鍋,而後集體PC去.對應這個狀況,你須要爲本身制定三個任務:搭車找車車、烤魚和網吧PC.用vim建立建立一個名叫rakefile的文件(備註:Rake會在當前路徑下尋找名叫Rakefile、rakefile、RakeFile.rb和rakefile.rb的rake文件),並鍵入以下代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
desc "任務1 -- 搭車去車車那裏" #這聽說是個苦差,由於太遠了
task :busboy do
puts "發現挫男"
end
  
desc "任務2 -- 烤魚"
task :bitchfish do
puts "老闆,先烤九斤魚"
end
  
desc "任務3 -- 網吧PC"
task :pc do
puts "我選中路"
end

 

打開命令行工具,進入這個文件所在目錄,而後運行下面的命令,大體應該相似以下結果:

?
1
2
3
4
5
6
7
8
9
10
11
D:\work>rake busboy
(in D:/work)
發現挫男
  
D:\work>rake bitchfish
(in D:/work)
老闆,先烤九斤魚
  
D:\work\ruby_works\ruby_book>rake laundry
(in D:/work)
我選中路


(備註:文字部分是沒啥邏輯的,純粹娛樂下...)

分析:

相信看完上面那段東東,你已經知道怎麼搞了...如今介紹些基礎知識,方便加深理解.從上面的代碼能夠知道,此文件一共定義了3個任務,desc是Rake定義的方法,表示對下面定義任務的描述.這個描述會在使用Rake --tasks(或者Rake -T)命令時輸出在屏幕上.

?
1
2
3
4
5
D:\work>rake - -tasks
(in D:/work)
rake bitchfish #任務2 -- 烤魚
rake busboy #任務1 -- 搭車去車車那裏(這聽說是個苦差,由於太遠了)
rake pc 任務3 -- 網吧PC

 


task是Rake最重要的方法.它的方法定義是:task(args, &block).任務體是一個block,本例中只是簡單輸出你所要作的工做.須要注意的是代碼

?
1
puts "發現挫男"


徹底是一個普通的Ruby語句,puts是Ruby中進行輸出的通常性方法,能夠看出,Rake任務能夠徹底使用Ruby的能力,這使得它很是強大.

go..go..go..go..

接下來加入依賴關係:

很顯然,在咱們定義的任務中,"烤魚"是依賴於"搭車去車車那裏"的(其它地方有沒烤魚吃不知道,反正地點就定在那了).那麼,咱們須要在咱們的任務定義中加入這個依賴關係,修改後的文件以下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
desc "任務1 -- 搭車去車車那裏"
task :busboy do
puts "發現挫男"
end
  
desc "任務2 -- 烤魚"
task :bitchfish => :busboy do
puts "老闆,先烤九斤魚"
end
  
desc "任務3 -- 網吧PC"
task :pc do
puts "我選中路"
end

 

再次運行烤魚任務,你會獲得以下結果: 

?
1
2
3
4
D:\work>rake bitchfish
(in D:/work)
發現挫男
老闆,先烤九斤魚

加入命名空間:

跟任何編程語言相似,當你的rake文件不少時,當你有不少任務的時候,你須要關注它們的命名衝突問題,命名空間(namespace)就是一個天然的解決方案.你能夠爲上面的三個任務定義一個叫作dan的命名空間.

?
1
2
3
4
5
6
7
namespace :dan do
desc "任務1 -- 搭車去車車那裏"
task :busboy do
puts "發現挫男"
end
……
end

 

再次運行rake --tasks,你會獲得以下的結果:

?
1
2
3
4
5
D:\work >rake --tasks
( in D: /work )
rake dan:bitchfish # 任務2 -- 烤魚
rake dan:pc # 任務3 -- 網吧PC
rake dan:busboy # 任務1 -- 搭車去車車那裏


你如今須要使用rake dan:bitchfish才能啓動烤魚這個任務了. 
(BTW,你能夠在你的rakefile中使用多個命名空間,對任務進行分類.)

瞭解了上面兩個知識點後,咱們來了解下兩個具體實例:

1.在一個任務中調用另一個任務

當任務衆多的時候,你極可能須要在一個任務中調用另一個任務,假設咱們把今天全部要作的工做定義爲一個任務:today.在這個任務中,有兩個任務須要被調用,一個是烤魚,一個是網吧PC.固然,因爲烤魚依賴於搭車去車車那裏,咱們仍是須要搭車去車車那裏的.在文件的頂部定義一個today的任務:

?
1
2
3
4
5
6
7
8
9
desc "今天的任務"
task :today do
Rake::Task[ "dan:bitchfish" ].invoke
Rake::Task[ "dan:pc" ].invoke
end
  
namespace :dan do
……
end

 

能夠看出,調用其它任務的方式很簡單,只須要調用

?
1
Rake::Task[ "task_name" ].invoke

方法就能夠了.在命令行中啓動rake today,能夠獲得:

?
1
2
3
4
5
D:\work >rake today
( in D: /work )
發現挫男
老闆,先烤九斤魚
我選中路

2.默認任務:

能夠爲Rake增長一個默認任務,這樣能夠簡單地用Rake命令來觸發這個默認任務,在上面的rakefile中,咱們能夠用以下方式把"today"任務做爲默認任務.

?
1
task :default => [ :today ]


而後調用直接在命令行中調用rake,能夠獲得跟調用rake today一樣的輸出結果.

這就是咱們簡單的一個Rake任務定義,下面是完整的修改後的rakefile:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
task :default => [ :today ]
  
desc "今天的任務"
task :today do
  Rake::Task[ "dan:bitchfish" ].invoke
  Rake::Task[ "dan:pc" ].invoke
end
  
namesoace :dan do
  desc "任務1 -- 搭車去車車那裏(這聽說是個苦差,由於太遠了)"
  task :busboy do
   puts "發現挫男"
  end
  
  desc "任務2 -- 烤魚"
  task :bitchfish do
   puts "老闆,先烤九斤魚"
  end
  
  desc "任務3 -- 網吧PC"
  task :pc do
   puts "我選中路"
  end
end

看完上面兩個例子,估計rake任務就算所有了解了...其它都是些代碼槍花罷了..多耍即是..

Rake簡介

Rake的意思是Ruby Make,一個用ruby開發的代碼構建工具.

可是,爲何Ruby須要Rake?

    按理說Ruby代碼無需編譯,應該不須要Rake纔對呀?原來,Rake另有妙用,即把Rake當作一個任務管理工具來使用...這樣作有兩個好處:

1.以任務的方式建立和運行腳本

   固然,你能夠用腳原本建立每個你但願自動運行的任務.可是,對於大型的應用來講,你幾乎老是須要爲數據庫遷移(好比Rails中db:migrate任務)、清空緩存、或者代碼維護等等編寫腳本.對於每一項任務,你可能都須要寫若干腳本,這會讓你的管理變得複雜.那麼,把它們用任務的方式整理到一塊兒,會讓管理變得輕鬆不少.

2.追蹤和管理任務之間的依賴

Rake還提供了輕鬆管理任務之間依賴的方式.好比,"migrate"任務和"schema:dump"任務都依賴於 "connect_to_database"任務,那麼在"migrate"任務調用以前,"connect_to_database"任務都會被執行.

下面入正題吧,即如何用Rake編寫一個任務腳本..

順序執行

在Rake中定義任務後,能夠指定任務的執行順序,例如,天天早晨起牀後的例行公事:
1. 關閉鬧鐘
2. 梳洗打扮
3. 泡杯咖啡
4. 遛狗
上面的幾項事物,在Rakefile中這樣描述

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
task :turn_off_alarm do
  puts "Turned off alarm. Would have liked 5 more minutes, though."
end
 
task :groom_myself do
  puts "Brushed teeth."
  puts "Showered."
  puts "Shaved."
end
 
task :make_coffee do
  cups = ENV [ "COFFEE_CUPS" ] || 2
  puts "Made #{cups} cups of coffee. Shakes are gone."
end
 
task :walk_dog do
  puts "Dog walked."
end
 
task :ready_for_the_day => [ :turn_off_alarm , :groom_myself , :make_coffee , :walk_dog ] do
  puts "Ready for the day!"
end


經過rake ready_for_the_day來執行任務,而後你就能夠看到,全部的task都在按照你預約的順序在執行。

?
1
2
3
4
5
6
7
Turned off alarm. Would have liked 5 more minutes, though.
Brushed teeth.
Showered.
Shaved.
Made 5 cups of coffee. Shakes are gone.
Dog walked.
Ready for the day!


此外還能夠用過rake make_coffee COFFEE_CUPS=5這樣在命令中給變量賦值。

命名空間

上面那樣定義任務沒有問題,但若是你須要另外定義些事物,好比工做相關的,交通相關的,這時候全部的任務混雜到一塊兒顯然就不合適了,畢竟上面那些任務只是咱們起牀的例行事物,與其它無關。

經過namespace能夠幫助咱們定義出Rails中相似rake db:migrate的任務,描畫出事物間清晰的邊界,將上面的任務包括在namespace的一個代碼塊中,以下

?
1
2
3
4
namespace :morning do
  task :turn_of_alarm
  ....
end


這一次咱們的調用命令就須要稍微作出些許變化,rake COFFEE_CUPS=3 morning:ready_for_the_day。 是否是跟rails中的rake任務調用方式很像呢?

默認Task

有了上面那些設置,若是咱們忘記或者不想寫詳細的任務名稱,直接執行rake會有什麼效果呢,結果是rake aborted!,任務被中斷的報錯。既然有這樣的可能性,咱們就須要消除這些隱患,經過設置default默認任務就能夠作到,以下:

?
1
task :default => 'morning:turn_off_alarm'


當你直接執行rake命令時,會執行默認操做,幫咱們關閉鬧鐘。

描述你的Task

當任務漸漸變多之後,管理問題就暴露出來了,除了命名空間之外,咱們還須要文檔類的支持,幫助咱們梳理任務並顯示的告訴咱們每一個任務的目的和功能,這時你能夠試一試用desc描述任務。

?
1
2
3
4
5
6
7
...
desc "Make coffee"
task :make_coffee do
  cups = ENV [ "COFFEE_CUPS" ] || 2
  puts "Made #{cups} cups of coffee. Shakes are gone."
end
...


上面的描述不只能夠在文檔中查看,同時使用rake -T也能清洗的瞭解到每一個任務是作什麼的。rake -T的輸出結果是按照字母順序排的序。

?
1
rake morning :make_coffee    # Make coffee


調取Task

Rake還容許在不一樣任務之間互相調用,例以下面的代碼,你想在下午也來杯咖啡,不用重複定義,直接使用上午的泡法,來一杯便可。

?
1
2
3
4
5
6
namespace :afternoon do
   task :make_coffee do
    Rake::Task[ 'morning:make_coffee' ].invoke
    puts "Ready for the rest of the day!"
   end
  end


Rake腳本編寫

先來個簡單的例子,以下:

假設你是一個火星成員,老版本那些,即如燕兒虎跑之類的,在週末你打算去車車那邊打火鍋,而後集體PC去.對應這個狀況,你須要爲本身制定三個任務:搭車找車車、烤魚和網吧PC.用vim建立建立一個名叫rakefile的文件(備註:Rake會在當前路徑下尋找名叫Rakefile、rakefile、RakeFile.rb和rakefile.rb的rake文件),並鍵入以下代碼:

?
1
2
3
4
5
6
7
8
9
相關文章
相關標籤/搜索