Rake post test task

Hi,

How do I run a task after the fact with Rake?

For example, I have a test task for a C extension. It looks something
like this:

Rake::TestTask.new('test') do |test|
   task :test => [:build]
   test.libs << 'ext'
   test.warning = true
   test.verbose = true
end

That works fine, but I'd like it to run the "clean" task after it's
finished.

And no, simply sticking "task :test => [:clean]" at the bottom of the
test task doesn't work.

Regards,

Dan

task :test do
   Rake.application[:clean].execute
end

You can append as many blocks of code to a task as you want. The blocks will be run in the order they were added. This block looks up the "clean" task in the application and then invokes the execute method.

Blessings,
TwP

···

On Feb 18, 2009, at 8:15 AM, Daniel Berger wrote:

Hi,

How do I run a task after the fact with Rake?

For example, I have a test task for a C extension. It looks something
like this:

Rake::TestTask.new('test') do |test|
  task :test => [:build]
  test.libs << 'ext'
  test.warning = true
  test.verbose = true
end

That works fine, but I'd like it to run the "clean" task after it's
finished.

And no, simply sticking "task :test => [:clean]" at the bottom of the
test task doesn't work.

Regards,

Dan

How do I run a task after the fact with Rake?

For example, I have a test task for a C extension. It looks something
like this:

Rake::TestTask.new('test') do |test|
  task :test => [:build]
  test.libs << 'ext'
  test.warning = true
  test.verbose = true
end

That works fine, but I'd like it to run the "clean" task after it's
finished.

And no, simply sticking "task :test => [:clean]" at the bottom of the
test task doesn't work.

task :test => :clean DOES work, just _before_ the fact, not after.

to do after you attach another task to the same name:

task :test do
   after
end

One problem with Tim's suggestion:

task :test do
Rake.application[:clean].execute
end

is that it won't run if that dependency has already been met, so:

% rake clean test

won't run it after your test. You might prefer to do:

task :test do
  sh "rake clean"
end

instead.

···

On Feb 18, 2009, at 07:15 , Daniel Berger wrote:

----

that said... why are you cleaning afterwards? I can imagine a number of situations where that will screw you up. You probably DO want to put :clean (pre) dependencies on a number of your tasks like packaging and stuff, but having it after your test could introduce some hiccups.

if it is a lengthy build/link, it'll also slow down code/test cycles.

Thanks Tim, that will work.

Regards,

Dan

···

On Feb 18, 9:10 am, Tim Pease <tim.pe...@gmail.com> wrote:

On Feb 18, 2009, at 8:15 AM, Daniel Berger wrote:

> Hi,

> How do I run a task after the fact with Rake?

> For example, I have a test task for a C extension. It looks something
> like this:

> Rake::TestTask.new('test') do |test|
> task :test => [:build]
> test.libs << 'ext'
> test.warning = true
> test.verbose = true
> end

> That works fine, but I'd like it to run the "clean" task after it's
> finished.

> And no, simply sticking "task :test => [:clean]" at the bottom of the
> test task doesn't work.

> Regards,

> Dan

task :test do
Rake.application[:clean].execute
end

You can append as many blocks of code to a task as you want. The
blocks will be run in the order they were added. This block looks up
the "clean" task in the application and then invokes the execute method.

How do I run a task after the fact with Rake?

For example, I have a test task for a C extension. It looks something
like this:

Rake::TestTask.new('test') do |test|
task :test => [:build]
test.libs << 'ext'
test.warning = true
test.verbose = true
end

That works fine, but I'd like it to run the "clean" task after it's
finished.

And no, simply sticking "task :test => [:clean]" at the bottom of the
test task doesn't work.

task :test => :clean DOES work, just _before_ the fact, not after.

to do after you attach another task to the same name:

task :test do
after
end

The after here is a placeholder for code, right? It can't be a task name
since a task does not define a method which can be invoked like that, at
least not with the Rake I've got installed on my maching.

Unless I'm missing something this is effectively the same thing as one :test
task with the code from both inside the block.

It works but...

that said... why are you cleaning afterwards? I can imagine a number of
situations where that will screw you up. You probably DO want to put :clean
(pre) dependencies on a number of your tasks like packaging and stuff, but
having it after your test could introduce some hiccups.

The way I'd approach this would be to have tasks for whatever sequences of
subtasks make sense, so something like:

  desc "clean up"
  task :clean do |t|
    puts "cleaning up"
  end

  desc "test"
  task :test do |t|
    puts "testing"
  end

  desc "test and clean up"
  task :test_and_cleanup => [:test, :clean]

  desc "clean up then test"
  task :cleanup_and_test => [:clean, :test]

Task names could be adjusted, so if you wanted to normally clean up and then
test, or test and then clean up you could rename
the 'normal' task, .e.g :test becomes something like :test_only and
:cleanup_and_test becomes :test

···

On Thu, Feb 19, 2009 at 12:06 AM, Ryan Davis <ryand-ruby@zenspider.com>wrote:

On Feb 18, 2009, at 07:15 , Daniel Berger wrote:

--
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale

> How do I run a task after the fact with Rake?

> For example, I have a test task for a C extension. It looks something
> like this:

> Rake::TestTask.new('test') do |test|
> task :test => [:build]
> test.libs << 'ext'
> test.warning = true
> test.verbose = true
> end

> That works fine, but I'd like it to run the "clean" task after it's
> finished.

> And no, simply sticking "task :test => [:clean]" at the bottom of the
> test task doesn't work.

task :test => :clean DOES work, just _before_ the fact, not after.

to do after you attach another task to the same name:

task :test do
after
end

One problem with Tim's suggestion:

> task :test do
> Rake.application[:clean].execute
> end

is that it won't run if that dependency has already been met, so:

% rake clean test

won't run it after your test. You might prefer to do:

> task :test do
> sh "rake clean"
> end

instead.

Interesting, thanks.

that said... why are you cleaning afterwards? I can imagine a number
of situations where that will screw you up. You probably DO want to
put :clean (pre) dependencies on a number of your tasks like packaging
and stuff, but having it after your test could introduce some hiccups.

if it is a lengthy build/link, it'll also slow down code/test cycles.

It's a small C extension, meaning I have to :build before I run the
tests. That's fine, but it leaves the .so, .obj, etc, files laying
around afterward. So rather than running 'rake clean' (or running
'make distclean' manually) after every 'rake test', I just want the
build files cleaned up automatically because I have no use for them.

Regards,

Dan

···

On Feb 18, 10:06 pm, Ryan Davis <ryand-r...@zenspider.com> wrote:

On Feb 18, 2009, at 07:15 , Daniel Berger wrote:

The Rake::Task#execute method will always run the task regardless of whether it has been run previously. You are thinking of the Rake::Task#invoke method -- this method ensures the task is only executed once.

Blessings,
TwP

···

On Feb 18, 2009, at 10:06 PM, Ryan Davis wrote:

On Feb 18, 2009, at 07:15 , Daniel Berger wrote:

How do I run a task after the fact with Rake?

For example, I have a test task for a C extension. It looks something
like this:

Rake::TestTask.new('test') do |test|
task :test => [:build]
test.libs << 'ext'
test.warning = true
test.verbose = true
end

That works fine, but I'd like it to run the "clean" task after it's
finished.

And no, simply sticking "task :test => [:clean]" at the bottom of the
test task doesn't work.

task :test => :clean DOES work, just _before_ the fact, not after.

to do after you attach another task to the same name:

task :test do
after
end

One problem with Tim's suggestion:

task :test do
Rake.application[:clean].execute
end

is that it won't run if that dependency has already been met, so:

% rake clean test

won't run it after your test. You might prefer to do:

<snip>

The way I'd approach this would be to have tasks for whatever sequences of
subtasks make sense, so something like:

desc "clean up"
task :clean do |t|
puts "cleaning up"
end

desc "test"
task :test do |t|
puts "testing"
end

desc "test and clean up"
task :test_and_cleanup => [:test, :clean]

desc "clean up then test"
task :cleanup_and_test => [:clean, :test]

Task names could be adjusted, so if you wanted to normally clean up and then
test, or test and then clean up you could rename
the 'normal' task, .e.g :test becomes something like :test_only and
:cleanup_and_test becomes :test

Hm, maybe I should just create a separate task as you say.

Thanks,

Dan

···

On Feb 19, 10:07 am, Rick DeNatale <rick.denat...@gmail.com> wrote:

Interestingly, I discovered that the Rake::Task.execute approach you
suggested broke with Rake 0.8.1. It worked fine after I upgraded to
0.8.3.

Don't ask me how I forgot to upgrade Rake on this particular system,
but there you go.

Regards,

Dan

···

On Thu, Feb 19, 2009 at 1:34 PM, Tim Pease <tim.pease@gmail.com> wrote:

On Feb 18, 2009, at 10:06 PM, Ryan Davis wrote:

On Feb 18, 2009, at 07:15 , Daniel Berger wrote:

How do I run a task after the fact with Rake?

For example, I have a test task for a C extension. It looks something
like this:

Rake::TestTask.new('test') do |test|
task :test => [:build]
test.libs << 'ext'
test.warning = true
test.verbose = true
end

That works fine, but I'd like it to run the "clean" task after it's
finished.

And no, simply sticking "task :test => [:clean]" at the bottom of the
test task doesn't work.

task :test => :clean DOES work, just _before_ the fact, not after.

to do after you attach another task to the same name:

task :test do
after
end

One problem with Tim's suggestion:

task :test do
Rake.application[:clean].execute
end

is that it won't run if that dependency has already been met, so:

% rake clean test

won't run it after your test. You might prefer to do:

The Rake::Task#execute method will always run the task regardless of whether
it has been run previously. You are thinking of the Rake::Task#invoke method
-- this method ensures the task is only executed once.

Upon further review that won't work, because the :clean task is
already a prerequisite for the :build task. So, what I'm really doing
is "clean, build, test, clean".

It may seem redundant, but sometimes I do the ol' "ruby extconf.rb;
make" routine by hand first for various reasons, then run a rake task
later, and I won't the "old" build files cleaned up first.

Regards,

Dan

···

On Feb 19, 11:10 am, Daniel Berger <djber...@gmail.com> wrote:

On Feb 19, 10:07 am, Rick DeNatale <rick.denat...@gmail.com> wrote:

<snip>

> The way I'd approach this would be to have tasks for whatever sequences of
> subtasks make sense, so something like:

> desc "clean up"
> task :clean do |t|
> puts "cleaning up"
> end

> desc "test"
> task :test do |t|
> puts "testing"
> end

> desc "test and clean up"
> task :test_and_cleanup => [:test, :clean]

> desc "clean up then test"
> task :cleanup_and_test => [:clean, :test]

> Task names could be adjusted, so if you wanted to normally clean up and then
> test, or test and then clean up you could rename
> the 'normal' task, .e.g :test becomes something like :test_only and
> :cleanup_and_test becomes :test

Hm, maybe I should just create a separate task as you say.