Порядок выполнения задания на рейк-тест

У меня есть 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 будет запускать задачи в указанном мной порядке, но, похоже, сначала всегда выполняется тестовая задача. Примечательно, что тесты не запускаются, но результат создания задачи все равно выдается.


person Roman Podolski    schedule 02.05.2016    source источник
comment
Будет ли приемлемым решением задача, которая просто запускает другие в правильном порядке?   -  person tadman    schedule 02.05.2016
comment
Пробовал, вроде не работает. Тестовая задача просто не вызывается.   -  person Roman Podolski    schedule 02.05.2016


Ответы (2)


Если вы хотите запускать задачи в определенном порядке, вы должны зависеть друг от друга. В вашем случае :flash_application должно зависеть от :hardware

person Torsten Robitzki    schedule 02.05.2016
comment
Я также хочу иметь возможность запускать тесты, не запуская выборку и перепрошивку, поскольку эти два процесса занимают некоторое время. Это было бы невозможно, если бы я зависел от задач друг от друга, верно? - person Roman Podolski; 02.05.2016
comment
Нет, если задача не создает какой-то артефакт. Либо у вас есть две задачи, на которых выполняются тесты без предиката, а другая — на выполнении тестов после выполнения предикатов. Или вы реализуете какой-то кеш для длительных задач. - person Torsten Robitzki; 02.05.2016

Найдена ошибка. Эта проблема не связана с ruby/rake. Задача flash_application изменяет рабочий каталог. Из-за этого в текущем рабочем каталоге нет Rakefile с задачей «аппаратное обеспечение». Но исследование этой ошибки дало некоторые интересные сведения.

  • Массивы Ruby упорядочены, если вы хотите выполнить задачу в порядке, достаточно определить их в порядке выполнения в массиве, т.е.

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

  • Rake::TestTask.new при вызове определяет простую старую задачу rake. Это означает, что при вызове rake ruby ​​создает экземпляр Rake::TestTask. Весь код, переданный в конструктор, выполняется/выдается на этом этапе. Это дает описанное поведение из исходного вопроса.

person Roman Podolski    schedule 02.05.2016