Как выполнить задачу Rake Task после всех других задач? (т.е. задача Rake AfterBuild)
Я новичок в Rake и использую его для создания проектов .net. Меня интересует сводная задача, в которой выдается сводка о том, что было сделано. Я хочу, чтобы эта задача всегда вызывалась, независимо от того, с какими задачами вызывается rake.
Есть ли простой способ сделать это?
Спасибо
Обновление вопроса, ответ на Ответ Патрика, что я хочу, - это задача после запуска запуска сразу после всех других задач, поэтому я хочу:
task :test1 do
puts 'test1'
end
task :test2 do
puts 'test2'
end
Rake::Task.tasks.each do |t|
<Insert rake magic here>
# t.enhance do
# puts 'after'
# end
end
$ rake test1
test1
after
$rake test2
test2
after
$rake test1 test2
test1
test2
after
и если
task :test3 =>[:test1, :test2]
puts 'test3'
end
$rake test3
test1
test2
test3
after
Несмотря на то, что щедрота ушла, дальнейшая помощь очень ценится. (К сожалению, я не думаю, что могу предложить еще одну награду.)
Ответы
Ответ 1
Проводя это как новый ответ, чтобы сохранить доступный другой. Это намного менее изящно, так как мне нужно войти в кишки Rake и вручную обновить список задач, но он работает.
task :test1 do
puts 'test1'
end
task :test2 do
puts 'test2'
end
task :after do
puts 'after'
end
# top_level_tasks is't writable so we need to do this ugly
# instance_variable_set hack...
current_tasks = Rake.application.top_level_tasks
current_tasks << :after
Rake.application.instance_variable_set(:@top_level_tasks, current_tasks)
Выходы:
$ rake test1
test1
after
$ rake test1 test2
test1
test2
after
Ответ 2
Вы можете сделать это с помощью функции "увеличить":
Rake::Task["my_task"].enhance do
Rake::Task["my_after_task"].invoke
end
Это вызовет "my_after_task" для вызова после "my_task".
Если вы хотите применить это ко всем задачам, просто зациклируйте все задачи и повысьте количество вызовов для каждого:
Rake::Task.tasks.each do |t|
t.enhance do
Rake::Task["my_after_task"].invoke
end
end
Полный тестовый файл:
task :test1 do
puts 'test1'
end
task :test2 do
puts 'test2'
end
Rake::Task.tasks.each do |t|
t.enhance do
puts 'after'
end
end
И вывод:
$ rake test1
test1
after
$ rake test2
test2
after
Ответ 3
Нашел этот простой элегантный ответ здесь, который использует метод Ruby at_exit
.
Стоит отметить, что метод, определенный после at_exit
, будет запускаться каждый раз, когда вызывается rake script независимо от запуска задачи или запускается любая задача. Это включает при запуске rake -T
(для перечисления доступных задач). Убедитесь, что at_exit
выполняет только что-либо, если предыдущая задача подсказывала это сделать.
rakefile.rb
desc "Lovely task a"
task :a do
puts "a"
end
desc "Lovely task b"
task :b do
puts "b"
end
task :cleanup do
puts "cleanup"
end
at_exit { Rake::Task[:cleanup].invoke if $!.nil? }
оболочки
$ rake a b
a
b
cleanup
$ rake -T
rake a # Lovely task a
rake b # Lovely task b
cleanup
Вам также не нужно запускать задачу, если вы этого не хотите.
at_exit do
puts "cleanup"
end
Или запустите метод
def on_exit_do_cleanup
puts "cleanup"
end
at_exit { on_exit_do_cleanup }
И вы можете захотеть убедиться, что вы выполняете очистку только в том случае, если задача действительно выполнялась, чтобы rake -T
также не выполнял очистку.
rakefile.rb
do_cleanup = false
desc "Lovely task a"
task :a do
puts "a"
do_cleanup = true
end
desc "Lovely task b"
task :b do
puts "b"
do_cleanup = true
end
task :cleanup do
return unless $!.nil? # No cleanup on error
return unless do_cleanup # No cleanup if flag is false
puts "cleanup"
end
at_exit { Rake::Task[:cleanup].invoke }
Ответ 4
Помимо уродливого Rake.application.instance_variable_set
, вы можете улучшить последнюю задачу в командной строке следующим образом:
last_task = Rake.application.top_level_tasks.last
Rake::Task[last_task].enhance do
puts 'after'
end
Это должно делать именно то, что вам нужно сделать!
Ответ 5
Вы можете использовать вызов Kernel.trap и подключаться к сигналу "Выход". Он срабатывает как при нормальном, так и в ненормальном выходе.
Поместите это раньше в свой файл rakefile:
Kernel.trap("EXIT") do
Rake::Task[:final].invoke
end
Теперь, когда вы выполняете "окончательную" задачу, она будет выполнена в самом конце программы. независимо от того, что.
task :final do
puts "Hit return to continue..."
STDIN.getc
end
Ответ 6
Я не знаю, лучший ли это, но проще:
Сделайте все свои "общедоступные задачи" сводными, которые вызывают реальные задачи.
task :compile => :realcompile do
summary stuff
end
Ответ 7
Если кто-то пришел сюда, чтобы узнать, как выполнить задачу перед всеми другими задачами (например, специальная задача загрузки env), вы все равно можете использовать один и тот же метод повышения, за исключением только первого аргумента:
task :environment do
env = (ENV['RACK_ENV'] || 'production').downcase
# do things before other tasks
end
# run environment task before all tasks for setup
Rake::Task.tasks.each do |t|
next if t.name == 'environment'
t.enhance [:environment]
end