2014-03-14 42 views
2

我建立一個Rake文件具有鑽石的依賴,耙調用任務兩次-m

A 
/\ 
B C 
\/
    D 

和Rake文件如下。

task :default => :a 

task :a => [:b, :c] do |t| 
    puts "#{t.name}" 
end 

task :b => :d do |t| 
    puts "#{t.name}" 
end 

task :c => :d do |t| 
    puts "#{t.name}" 
end 

task :d do |t| 
    puts "#{t.name}" 
end 

問題是使用多任務選項調用task :d兩次。

$ rake -m 
d 
d 
c 
b 
a 

task :d是應該在每次運行rake時調用的任務,但是在每次構建中都應該調用一次。

我考慮過使用filetask,但由於它實際上是一個向遠程服務器發送信號的任務,因此沒有該任務生成的文件。

我也試過下面的時間戳方法,但它沒有做任何改變。

def (task(:d)).timestamp 
    if @timestamp 
    @timestamp 
    else 
    @timestamp = Time.now 
    end 
end 

我應該怎麼做才能使它工作?

回答

0

由於先決條件任務是按順序運行的,因此只有一個從C到D的依賴任務是有意義的,並且從B沒有一個依賴任務。這樣,您可以確保B和C在D運行之前運行。

+0

前提條件的任務不按順序運行,但同時,如果你'耙-m'。 – kukyakya

+0

在這種情況下,我會跳過併發任務。 – archie

1

因爲rake是普通的ruby,所以你可以使用每一個正常的ruby-technique來確保d後面的東西只能做一次。

其實我想你的例子有相當最近耙版本,無法重現你的問題:

> rake --version 
rake, version 10.1.0 
> rake 
d 
b 
c 
a 
> rake -m 
d 
b 
c 
a