2013-12-12 27 views
1

在Rake中,我可以使用以下語法聲明該任務charlie需要任務alphabravo先完成。如何使用先決條件聲明Rake :: PackageTask?

task :charlie => [:alpha, :bravo] 

這似乎很好地工作,如果charlie是一個典型的Rake任務或文件的任務,但我無法弄清楚如何爲Rake::PackageTask做到這一點。下面是Rake文件的相關部分迄今:

require 'rake/packagetask' 

file :package_jar => [:compile] do 
    puts("Packaging library.jar...") 
    # code omitted for brevity, but this bit works fine 
end 

Rake::PackageTask.new("library", "1.0") do |pt| 
    puts("Packaging library distribution artefact...") 
    pt.need_tar = true 
    pt.package_files = ["target/library.jar"] 
end 
task :package => :package_jar 

這裏發生的事情是,對於一個乾淨的構建,它抱怨不「知道如何建立任務‘目標/ library.jar’」 。我必須從命令行手動運行rake package_jar才能使其正常工作,這有點麻煩。 有什麼辦法可以讓package取決於package_jar

對於什麼是值得的,我在Linux上使用Rake版本0.9.2.2和Ruby 1.8.7。

回答

1

當您運行rake package(以前沒有運行任何東西,以創建任何需要的文件)耙看到該包任務所需要的文件target/library.jar。由於該文件尚不存在,Rake會檢查它是否知道如何創建它。它不知道任何會創建該文件的規則,因此會失敗並顯示錯誤。

確實有它認爲會創建一個名爲package_jar文件中的任務,而事實上該任務創建文件target/library.jar,但它並沒有意識到這一點。

修正是告訴Rake在file任務中確切地創建了哪個文件。然後Rake會自動查找依賴關係。

變化

file :package_jar => [:compile] do 

file 'target/library.jar' => [:compile] do 

,然後刪除行

task :package => :package_jar 

因爲package_jar不再存在,佣金會自行找到該文件的依賴。

+0

這工作,謝謝。不過,這看起來很瘋狂,你不得不在他們出品的產品之後命名你的任務,而不是他們實際做的事!我不認爲有解決辦法,是嗎? – ATG

+0

@ATG在'file'任務的情況下,我認爲在創建文件後命名它們是有意義的。你告訴Rake「這就是你創建這個文件的過程」,這意味着如果Rake需要創建文件(就像在這種情況下),它知道該怎麼做。如果您希望能夠以更簡單的名稱自行調用該任務,則始終可以添加'task:package_jar =>'target/library.jar'。 – matt

+0

我明白你的觀點,但我習慣於能夠給我的任務/方法等描述他們所做的事情的有意義的名字。這看起來很奇怪,因爲傳統的構建任務(如「編譯」和「測試」)是根據執行的操作而不是操作的結果命名的。無論如何,感謝您的幫助! – ATG

0

通常在rake中,如果要爲任務添加依賴項,則需要該任務的名稱。所以你需要找出Rake::PackageTask註冊的實際rake任務的名稱。

最簡單的方法是使用--trace運行 - 它列出每個任務的執行名稱。

(我相信buildr包任務的名稱是它產生的軟件包的文件名,但我不記得一定的。使用--trace找出來。)

+0

運行'rake package --trace'會在堆棧跟蹤後產生以下結果:任務:TOP => package => target/library-1.0.tgz並添加'task'target/library-1.0.tgz「=> package_jar'到rakefile不會改變任何東西。它似乎仍然在尋找真正的JAR文件作爲一項先決任務,奇怪的是。 – ATG

0

您可以添加一個依賴於任何通過寫作任務,

someTask.enhance [other, tasks] 

其中othertasks可以是任務名稱或任務的對象。

所以你的情況,你可以寫:

library = Rake::PackageTask.new(...) do 
    ... 
end 

task(:package).enhance([library]) 
+0

這不行,恐怕。它失敗了:「不知道如何構建任務」#',這似乎表明Rake :: PackageTask甚至不是一個適當的rake任務!有任何想法嗎? – ATG