Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Q: How can a Rake task know the caller's directory?

Reply
Thread Tools

Q: How can a Rake task know the caller's directory?

 
 
James Britt
Guest
Posts: n/a
 
      01-15-2007
I'm increasingly using rake files for common system tasks. Since Rake
will search up a directory tree until it finds a Rakefile, I can have
one in my home directory and call tasks from anyplace below that.

But tasks that need to know something about the current directory have
me stymied. Calling Dir.pwd in a task reflects the directory of the
Rakefile.

Is there a rake method that returns the path of where the Rakefile
search began?


E.g., if I'm in /home/james/foo/bar, and the nearest Rakefile is in
/home/james, with task :whereami, and I call

$ rake whereami

what does :whereami have to do to return '/home/james/foo/bar' ?

Thanks!

--
James Britt


 
Reply With Quote
 
 
 
 
Joel VanderWerf
Guest
Posts: n/a
 
      01-15-2007
James Britt wrote:
> I'm increasingly using rake files for common system tasks. Since Rake
> will search up a directory tree until it finds a Rakefile, I can have
> one in my home directory and call tasks from anyplace below that.
>
> But tasks that need to know something about the current directory have
> me stymied. Calling Dir.pwd in a task reflects the directory of the
> Rakefile.
>
> Is there a rake method that returns the path of where the Rakefile
> search began?
>
>
> E.g., if I'm in /home/james/foo/bar, and the nearest Rakefile is in
> /home/james, with task :whereami, and I call
>
> $ rake whereami
>
> what does :whereami have to do to return '/home/james/foo/bar' ?


No idea. One possible solution is to put a "stub" rakefile in the dir,
and the stub requires the main rakefile. Then (IIRC) the pwd during the
rake tasks will be that of the stub. But maybe you don't want to scatter
stubs all over the place.

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

 
Reply With Quote
 
 
 
 
Mike Harris
Guest
Posts: n/a
 
      01-15-2007
James Britt wrote:

> I'm increasingly using rake files for common system tasks. Since Rake
> will search up a directory tree until it finds a Rakefile, I can have
> one in my home directory and call tasks from anyplace below that.
>
> But tasks that need to know something about the current directory have
> me stymied. Calling Dir.pwd in a task reflects the directory of the
> Rakefile.
>
> Is there a rake method that returns the path of where the Rakefile
> search began?
>
>
> E.g., if I'm in /home/james/foo/bar, and the nearest Rakefile is in
> /home/james, with task :whereami, and I call
>
> $ rake whereami
>
> what does :whereami have to do to return '/home/james/foo/bar' ?
>
> Thanks!
>

Modify rake to log the initial working directory before doing anything
else. You could do this by putting the line to log the dir in the file
bin/rake. Take advantage of ruby's openness.

Alternatively, you could put a file in a dir on your PATH (let's say
rake2) to log the dir and then delegate to rake, and just call rake2
instead of rake from the command line.

 
Reply With Quote
 
James Britt
Guest
Posts: n/a
 
      01-15-2007
Mike Harris wrote:
> James Britt wrote:
>
>> E.g., if I'm in /home/james/foo/bar, and the nearest Rakefile is in
>> /home/james, with task :whereami, and I call
>>
>> $ rake whereami
>>
>> what does :whereami have to do to return '/home/james/foo/bar' ?
>>
>> Thanks!
>>

> Modify rake to log the initial working directory before doing anything
> else. You could do this by putting the line to log the dir in the file
> bin/rake. Take advantage of ruby's openness.


I've hacked ruby apps in this manner before, but they are prone to "gem
update <name_of_gem>" stomping.

So any mods to rake itself have to happen via by a plugin that will
survive library updates.

>
> Alternatively, you could put a file in a dir on your PATH (let's say
> rake2) to log the dir and then delegate to rake, and just call rake2
> instead of rake from the command line.
>


Too hackish, even for me. I'd rather see about a cleaner way for any
arbitrary rake task to know the initial calling directory.

--
James Britt

"I have the uncomfortable feeling that others are making a religion
out of it, as if the conceptual problems of programming could be
solved by a single trick, by a simple form of coding discipline!"
- Edsger Dijkstra

 
Reply With Quote
 
James Britt
Guest
Posts: n/a
 
      01-15-2007
Joel VanderWerf wrote:
>
> No idea. One possible solution is to put a "stub" rakefile in the dir,
> and the stub requires the main rakefile. Then (IIRC) the pwd during the
> rake tasks will be that of the stub. But maybe you don't want to scatter
> stubs all over the place.


Right, that's the whole point. For example, I have a Rake task that
will do an svn commit. I've also aliased rake to r , so I can do this
to commit code:

$ r com This is my log message

and the :com task knows how to grab the message, do the commit, and run
a few other things (like svn status to alert if I missed adding any new
files).

Very handy, except as at stands, the invoked rake file thinks everything
happens relative where it lives, so I have to create a Rakefile
everyplace I want to use a location-Dependant task.


(Someone else mentioned using a "rake2" delegate; since I'm already
using 'r' as my rake invocation, maybe having a real r.rb that stores
the calling directory in ENV might work. That rake tasks that need the
caller dir can look for the value in ENV; these tasks could then assume
a default dir if this environment variable is empty.)

--
James Britt

"I have the uncomfortable feeling that others are making a religion
out of it, as if the conceptual problems of programming could be
solved by a single trick, by a simple form of coding discipline!"
- Edsger Dijkstra

 
Reply With Quote
 
James Britt
Guest
Posts: n/a
 
      01-16-2007
Mike Harris wrote:

> Alternatively, you could put a file in a dir on your PATH (let's say
> rake2) to log the dir and then delegate to rake, and just call rake2
> instead of rake from the command line.
>


I've tried that out, and it works quite well.

I had already aliased 'r' to 'rake' to save tying those extra three
characters. I now have a real script 'r' (well, "r.rb", which is now
the new r alias):


#!/usr/local/bin/ruby
ENV['cwd'] = Dir.pwd
puts `rake #{ARGV.join( ' ')}`

Tasks that need the caller's working directory now use

ENV['cwd'] || Dir.pwd



Thanks!


--
James Britt

"Take eloquence and wring its neck."
- Paul Verlaine

 
Reply With Quote
 
Trans
Guest
Posts: n/a
 
      01-16-2007

James Britt wrote:
> Joel VanderWerf wrote:
> >
> > No idea. One possible solution is to put a "stub" rakefile in the dir,
> > and the stub requires the main rakefile. Then (IIRC) the pwd during the
> > rake tasks will be that of the stub. But maybe you don't want to scatter
> > stubs all over the place.

>
> Right, that's the whole point. For example, I have a Rake task that
> will do an svn commit. I've also aliased rake to r , so I can do this
> to commit code:
>
> $ r com This is my log message


how are you accessing "This is my log message" in your task?

t.


 
Reply With Quote
 
James Britt
Guest
Posts: n/a
 
      01-16-2007
Trans wrote:
> James Britt wrote:
>> Joel VanderWerf wrote:
>>> No idea. One possible solution is to put a "stub" rakefile in the dir,
>>> and the stub requires the main rakefile. Then (IIRC) the pwd during the
>>> rake tasks will be that of the stub. But maybe you don't want to scatter
>>> stubs all over the place.

>> Right, that's the whole point. For example, I have a Rake task that
>> will do an svn commit. I've also aliased rake to r , so I can do this
>> to commit code:
>>
>> $ r com This is my log message

>
> how are you accessing "This is my log message" in your task?


ARGV.shift # remove the task name
ARGV.join( ' ') # Get everything else on the command line

Sadly, rake still thinks that there are more tasks on the command line;
even calling ARGV.clear doesn't help.

(I looked for the command to flush the Rake task call queue, but
couldn't find it, so I live with the error it raises at the end. )



--
James Britt

http://www.ruby-doc.org - Ruby Help & Documentation
http://www.artima.com/rubycs/ - The Journal By & For Rubyists
http://www.rubystuff.com - The Ruby Store for Ruby Stuff

 
Reply With Quote
 
Jim Weirich
Guest
Posts: n/a
 
      01-16-2007
James Britt wrote:
> I'm increasingly using rake files for common system tasks. Since Rake
> will search up a directory tree until it finds a Rakefile, I can have
> one in my home directory and call tasks from anyplace below that.
>
> But tasks that need to know something about the current directory have
> me stymied. Calling Dir.pwd in a task reflects the directory of the
> Rakefile.
>
> Is there a rake method that returns the path of where the Rakefile
> search began?
>
>
> E.g., if I'm in /home/james/foo/bar, and the nearest Rakefile is in
> /home/james, with task :whereami, and I call
>
> $ rake whereami
>
> what does :whereami have to do to return '/home/james/foo/bar' ?
>
> Thanks!


task :whereami do
puts Rake.original_dir
end


-- Jim Weirich

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Jim Weirich
Guest
Posts: n/a
 
      01-16-2007
James Britt wrote:
> Trans wrote:
>>> $ r com This is my log message

>>
>> how are you accessing "This is my log message" in your task?

>
> ARGV.shift # remove the task name
> ARGV.join( ' ') # Get everything else on the command line
>
> Sadly, rake still thinks that there are more tasks on the command line;
> even calling ARGV.clear doesn't help.
>
> (I looked for the command to flush the Rake task call queue, but
> couldn't find it, so I live with the error it raises at the end. )


You could do:

rake com MSG="This is my log message"

Inside of your Rakefile, ENV['MSG'] will contain your log message.

Sadly, more typing that what you have, but it works with rake instead of
against it.

-- Jim Weirich

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
rake published rdoc version and arity of Rake::Task#execute - wrongnumber of arguments (0 for 1) James Mead Ruby 0 01-15-2008 05:42 PM
[Rake] call a task of a namespace from an other task. Stéphane Wirtel Ruby 3 06-15-2007 06:52 AM
Rake and rake aborted! Rake aborted! undefined method `gem' for main:Object peppermonkey Ruby 1 02-10-2007 04:43 AM
[Rake] Don't know how to build task Brian Takita Ruby 2 05-24-2005 08:03 PM



Advertisments