Chasler Chasler - 4 months ago 9
Ruby Question

How do I make a Rake Task run after all other tasks? (i.e. a Rake AfterBuild task)

I'm new to Rake and using it to build .net projects. What I'm interested in is having a Summary task that prints out a summary of what has been done. I want this task to always be called, no matter what tasks rake was invoked with.

Is there an easy way to accomplish this?

Thanks




Update on the question, responding to Patrick's answer what I want is the after task to run once after all other tasks, so the output I want is:

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


and if

task :test3 =>[:test1, :test2]
puts 'test3'
end

$rake test3
test1
test2
test3
after


Even though the bounty is gone, any further help much appreciated. (Sadily I don't think that I can offer another bounty.)

Answer

Posting this as a new answer to keep the other one available. This is much less elegant as I have to get into the guts of Rake and manually update the task list, but it works.

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)

Outputs:

$ rake test1
test1
after

$ rake test1 test2
test1
test2
after