Подтвердить что ты не робот

Как выполнить задачу 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

Несмотря на то, что щедрота ушла, дальнейшая помощь очень ценится. (К сожалению, я не думаю, что могу предложить еще одну награду.)

4b9b3361

Ответ 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