У меня есть Rakefile, который компилирует проект двумя способами, в зависимости от глобальной переменной $build_type
, которая может быть :debug
или :release
(результаты помещаются в отдельные каталоги):
task :build => [:some_other_tasks] do
end
Я хочу создать задачу, которая компилирует проект с обеими конфигурациями по очереди, что-то вроде этого:
task :build_all do
[ :debug, :release ].each do |t|
$build_type = t
# call task :build with all the tasks it depends on (?)
end
end
Есть ли способ вызвать задачу, как если бы это был метод? Или как мне добиться чего-то подобного?
Rake::Task["build"].invoke
может быть намного более производительным, чем использование,system rake build
потому что ему не нужно создавать новый поток и загружать среду Rails, чтоsystem rake build
и нужно делать.Ответы:
Если вам нужно, чтобы задача работала как метод, как насчет использования реального метода?
Если вы предпочитаете придерживаться
rake
идиом, вот ваши возможности, составленные из предыдущих ответов:Это всегда выполняет задачу, но не выполняет ее зависимости:
Этот выполняет зависимости, но выполняет задачу, только если она еще не была вызвана:
Это сначала сбрасывает состояние задачи yes_invoked, позволяя затем выполнить задачу снова, зависимости и все:
Обратите внимание, что уже вызванные зависимости не выполняются автоматически, если они не включены повторно. В Rake> = 10.3.2 вы можете использовать следующее, чтобы снова включить их:
источник
Rake::Task['db:reset'].invoke
Rake::Task['with:args'].invoke("pizza")
ENV['VERSION'] = '20110408170816'; Rake::Task['db:migrate'].invoke
смотрите здесь для более подробного объяснения.#reenable()
что не повторно включить предварительные требования, и нуждался в этом. Это дополнение к Rake (> = 10.3.2)#all_prerequisite_tasks()
будет повторять все задачи, включая предварительные требования предварительных требований. Итак,Rake::Task[task].all_prerequisite_tasks.each &:reenable
rake db:reset db:migrate
). Можете ли вы сделать что-то вроде:Rake::Task["db:reset", "db:migrate"].invoke
например:
источник
Это должно разобраться, просто нужно то же самое самому.
источник
источник
источник
Если вы хотите, чтобы каждая задача выполнялась независимо от сбоев, вы можете сделать что-то вроде:
источник
Я бы посоветовал не создавать общие задачи отладки и выпуска, если проект действительно является чем-то, что компилируется и приводит к файлам. Вы должны пойти с файловыми задачами, что вполне выполнимо в вашем примере, поскольку вы утверждаете, что ваш вывод идет в разные каталоги. Скажем, ваш проект просто компилирует файл test.c в out / debug / test.out и out / release / test.out с помощью gcc, вы можете настроить свой проект следующим образом:
Эта настройка может быть использована как:
Это делает немного больше, как просили, но показывает мои очки:
источник