Search code examples
rubyrakerake-taskrakefile

Order of Rake Test Task


I have a rake file with three tasks, which I need to execute in order.

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]

when I run $ rake in a terminal, it produces the following output.

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

I would expect rake to run the tasks in the order I specified, but It seems to always execute the test task first. It is remarkable that the tests do not run - but the output of the task creation is produced anyway.


Solution

  • Found the Bug - This problem was not ruby / rake specific. The flash_application task changes the working directory. Because of that, there is no Rakefile with a task 'hardware' in the current working directory. But researching for this bug yielded some interesting insights.

    • Ruby arrays are ordered, if one want to execute task in an order it is sufficient to define them in execution order in an array i.e.

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

    • Rake::TestTask.new defines a plain old rake task when called. That means, when rake is called, ruby creates an instance of a Rake::TestTask. All code passed into the constructor is executed / yielded during this phase. This yields the described behavior from the original question.