Custom rake task

I was following Derek Bailey’s article from yesterday entitled “How to
Build Custom Rake Tasks; The Right Way”
<http://www.lostechies.com/blogs/derickbailey/archive/2010/07/26/how-to-
build-custom-rake-tasks-the-right-way.aspx> and tried to replicate some
of his code in IronRuby. Now I’ve run into a snag that I’m hoping
somebody can help with.

My .rb file looks like so:

require ‘rake’

def foo(*args)

body = proc {

puts 'hello world'

}

Rake::Task.define_task(*args, body)

end

foo :bar

task :default => [:bar]

Pretty simple, right? Well, when I run it using rake, I get the
following error:

C:\Users\txg0\Desktop>rake -f test1.rb --trace

(in C:/Users/txg0/Desktop)

rake aborted!

syntax error, unexpected IDENTIFIER, expecting AMPERSAND

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2383:in `load’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2383:in
`raw_load_rakefile’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2017:in
`load_rakefile’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in
`standard_exception_handling’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2016:in
`load_rakefile’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2000:in `run’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in
`standard_exception_handling’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in `run’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/bin/rake:31

C:/Program Files (x86)/IronRuby 1.0v4/bin/rake:19:in `load’

C:/Program Files (x86)/IronRuby 1.0v4/bin/rake:19

Anyone have any clues?

Confidentiality Notice: This e-mail message, including any attachments,
is for the sole use of the intended recipient(s) and may contain
confidential and privileged information. Any unauthorized review, copy,
use, disclosure, or distribution is prohibited. If you are not the
intended recipient, please contact the sender by reply e-mail and
destroy all copies of the original message.

The sample doesn’t run in MRI, either :slight_smile:

You need an ampersand in front of “body” when passing to define_task:

Rake::Task.define_task(*args, &body)

Sean

You’re missing an ampersand (&) on the define_task call. It should be:
Rake::Task.define_task(*args, *&*body)

Shay.

Shay F. | Microsoft Visual C#/IronRuby MVP | Author of IronRuby
Unleashed
Blog: http://IronShay.com | Twitter: http://twitter.com/ironshay

To pass the body proc into define_task, you need to turn it into a block
by calling &body. I would also recommend using a lambda instead of a
proc (due to return semantics). I’ll also be turning my WIX rake tasks
into a gem, so there will be more examples there.


From: Goode, Troy [email protected]
Sent: Tuesday, July 27, 2010 11:59 AM
To: [email protected] [email protected]
Subject: [Ironruby-core] custom rake task

I was following Derek Bailey’s article from yesterday entitled “How to
Build Custom Rake Tasks; The Right
Way”http://www.lostechies.com/blogs/derickbailey/archive/2010/07/26/how-to-build-custom-rake-tasks-the-right-way.aspx
and tried to replicate some of his code in IronRuby. Now I’ve run into a
snag that I’m hoping somebody can help with.

My .rb file looks like so:

require ‘rake’

def foo(*args)
body = proc {
puts ‘hello world’
}
Rake::Task.define_task(*args, body)
end

foo :bar

task :default => [:bar]

Pretty simple, right? Well, when I run it using rake, I get the
following error:

C:\Users\txg0\Desktop>rake -f test1.rb --trace
(in C:/Users/txg0/Desktop)
rake aborted!
syntax error, unexpected IDENTIFIER, expecting AMPERSAND
C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2383:in load' C:/Program Files (x86)/IronRuby 1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2383:in raw_load_rakefile’
C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2017:in
load_rakefile' C:/Program Files (x86)/IronRuby 1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in standard_exception_handling’
C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2016:in
load_rakefile' C:/Program Files (x86)/IronRuby 1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2000:in run’
C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in
standard_exception_handling' C:/Program Files (x86)/IronRuby 1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in run’
C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/bin/rake:31
C:/Program Files (x86)/IronRuby 1.0v4/bin/rake:19:in `load’
C:/Program Files (x86)/IronRuby 1.0v4/bin/rake:19

Anyone have any clues?

Confidentiality Notice: This e-mail message, including any attachments,
is for the sole use of the intended recipient(s) and may contain
confidential and privileged information. Any unauthorized review, copy,
use, disclosure, or distribution is prohibited. If you are not the
intended recipient, please contact the sender by reply e-mail and
destroy all copies of the original message.

When you give a method a block in Ruby (which is really what you’re
doing
here), and you’ve defined it as a Proc, you need to pass the variable
holding the Proc with an ampersand in front of it. This is because while
code blocks and Procs conceptually do the same thing, they are not. The
ampersand tells Ruby “hey, convert this to a code block for me”.


Will G.
http://hotgazpacho.org/

Specifically, if you do an explicit return (use the return keyword) from
a
Proc, that exits the scope in which the Proc is executed. lambdas that
return do not exit the scope in which it was executed.

See http://samdanielson.com/2007/3/19/proc-new-vs-lambda-in-ruby
http://samdanielson.com/2007/3/19/proc-new-vs-lambda-in-ruby

Will G.
http://hotgazpacho.org/

“Splat! is the star (*) operator, typically used in Ruby for defining
methods that take an unlimited number of arguments”

http://pivotallabs.com/users/nick/blog/articles/438-ruby-pearls-vol-1-the-splat

http://pivotallabs.com/users/nick/blog/articles/438-ruby-pearls-vol-1-the-splatIt
must appear as the last argument in a method signature, as it collects
all
values from its position on into an array.
http://www.manning.com/black2/

Will G.
http://hotgazpacho.org/

Thanks for the help everyone! I had been trying multiple variations of
the code I sent, removing/adding asterisks & ampersands and just never
stumbled upon the correct combo. Thanks again for the help!

From: [email protected]
[mailto:[email protected]] On Behalf Of Will G.
Sent: Tuesday, July 27, 2010 4:12 PM
To: [email protected]
Subject: Re: [Ironruby-core] custom rake task

Specifically, if you do an explicit return (use the return keyword) from
a Proc, that exits the scope in which the Proc is executed. lambdas that
return do not exit the scope in which it was executed.

See http://samdanielson.com/2007/3/19/proc-new-vs-lambda-in-ruby


Will G.
http://hotgazpacho.org/

On Tue, Jul 27, 2010 at 3:35 PM, Jim D. [email protected]
wrote:

To pass the body proc into define_task, you need to turn it into a block
by calling &body. I would also recommend using a lambda instead of a
proc (due to return semantics). I’ll also be turning my WIX rake tasks
into a gem, so there will be more examples there.


From: Goode, Troy [email protected]
Sent: Tuesday, July 27, 2010 11:59 AM
To: [email protected] [email protected]
Subject: [Ironruby-core] custom rake task

I was following Derek Bailey’s article from yesterday entitled “How to
Build Custom Rake Tasks; The Right Way”
http://www.lostechies.com/blogs/derickbailey/archive/2010/07/26/how-to-build-custom-rake-tasks-the-right-way.aspx
and tried to replicate some of his code in IronRuby. Now I’ve run into a
snag that I’m hoping somebody can help with.

My .rb file looks like so:

require ‘rake’

def foo(*args)

body = proc {

puts 'hello world'

}

Rake::Task.define_task(*args, body)

end

foo :bar

task :default => [:bar]

Pretty simple, right? Well, when I run it using rake, I get the
following error:

C:\Users\txg0\Desktop>rake -f test1.rb --trace

(in C:/Users/txg0/Desktop)

rake aborted!

syntax error, unexpected IDENTIFIER, expecting AMPERSAND

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2383:in `load’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2383:in
`raw_load_rakefile’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2017:in
`load_rakefile’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in
`standard_exception_handling’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2016:in
`load_rakefile’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2000:in `run’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in
`standard_exception_handling’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in `run’

C:/Program Files (x86)/IronRuby
1.0v4/lib/ironruby/gems/1.8/gems/rake-0.8.7/bin/rake:31

C:/Program Files (x86)/IronRuby 1.0v4/bin/rake:19:in `load’

C:/Program Files (x86)/IronRuby 1.0v4/bin/rake:19

Anyone have any clues?

Confidentiality Notice: This e-mail message, including any attachments,
is for the sole use of the intended recipient(s) and may contain
confidential and privileged information. Any unauthorized review, copy,
use, disclosure, or distribution is prohibited. If you are not the
intended recipient, please contact the sender by reply e-mail and
destroy all copies of the original message.


Ironruby-core mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/ironruby-core

Confidentiality Notice: This e-mail message, including any attachments,
is for the sole use of the intended recipient(s) and may contain
confidential and privileged information. Any unauthorized review, copy,
use, disclosure, or distribution is prohibited. If you are not the
intended recipient, please contact the sender by reply e-mail and
destroy all copies of the original message.