2016-05-02 63 views
0

我有一個包含三個任務的rake文件,需要按順序執行。Rake測試任務的順序

require 'rake/testtask' 

file 'some_binary_file.elf' do 
    puts 'fetching file from server ...' 
    # this task connects to a server and downloads some binaries 
    # it takes a few seconds to run 
end 

task flash_application: 'some_binary_file.elf' do 
    puts 'flashing the file to the hardware ...' 
    # this task copies a binary file to the flash memory 
    # of some external hardware, also takes a few seconds 
end 

Rake::TestTask(:hardware) do |t| 
    puts 'running tests ...' 
    f.test_files = FileList['test/**/*_test.rb'] 
end 

rake default: [:flash_application, :hardware] 

當我在終端運行$ rake時,它會產生以下輸出。

running tests ...     < ---- (not actually running) 
fetching file from server ... 
flashing the file to the hardware ... 

我希望rake按我指定的順序運行任務,但它似乎總是首先執行測試任務。非常值得注意的是,測試不會運行 - 但創建任務的輸出無論如何都會產生。

+0

會做出一個任務,只是以正確的順序觸發其他人是一個可接受的解決方案? – tadman

+0

試過了,似乎沒有工作。測試任務似乎沒有被調用。 –

回答

1

發現錯誤 - 此問題不是特定於ruby/rake的。 flash_application任務更改工作目錄。因此,當前工作目錄中沒有帶任務「硬件」的Rakefile。但是研究這個錯誤產生了一些有趣的見解。

  • 紅寶石陣列是有序的,如果一個想要的順序執行任務就足夠了定義它們在執行順序以陣列即

    task some_task: [:first, :second, :third]

  • Rake::TestTask.new限定一個普通的舊耙任務被調用時。這意味着,當rake被調用時,ruby會創建一個Rake :: TestTask的實例。傳遞給構造函數的所有代碼都會在此階段執行/生成。這產生了原始問題中描述的行爲。

2

當您想按特定順序運行任務時,您必須相互依賴它們。在你的情況下,:flash_application應該取決於:硬件

+0

我也希望能夠運行測試,無需運行讀取和閃爍,因爲這兩個需要一些時間。如果我依靠彼此的任務,這是不可能的,對嗎? –

+0

如果任務沒有創建某種形狀的工件,則不需要。要麼你有兩個任務,在沒有謂詞的情況下運行測試,在執行謂詞後運行測試。或者您爲長時間運行的任務實施某種緩存。 –