How to call Rake tasks that are defined in a standard Rakefile from another Ruby script?

Is it possible to call a task that is defined in Rakefile - not in somefile.rake - from another Ruby script?

I was hoping that creating a new Rake::Application would automatically load the Rakefile from the same directory, but it seems like it is not. Here is what I came up with so far:

 $LOAD_PATH.unshift File.dirname(__FILE__) require 'rake' require 'pp' rake = Rake::Application.new rake[:hello].invoke 

Execution of this code leads to the following:

 /opt/ruby/1.9.2-p180/lib/ruby/1.9.1/rake.rb:1720:in `[]': Don't know how to build task 'hello' (RuntimeError) from script.rb:7:in `<main>' 

pp rake gives the following:

 #<Rake::Application:0x00000101118da0 @default_loader=#<Rake::DefaultLoader:0x00000101118b20>, @imported=[], @last_description=nil, @loaders= {".rb"=>#<Rake::DefaultLoader:0x00000101118a80>, ".rf"=>#<Rake::DefaultLoader:0x000001011189b8>, ".rake"=>#<Rake::DefaultLoader:0x00000101118800>}, @name="rake", @original_dir= "/Users/t6d/Projects/Sandbox/Ruby/rake-from-ruby-script", @pending_imports=[], @rakefile=nil, @rakefiles=["rakefile", "Rakefile", "rakefile.rb", "Rakefile.rb"], @rules=[], @scope=[], @tasks={}, @top_level_tasks=[], @tty_output=false> 

Somehow annoying that @rakefile is nil .

May 20 update, 16:40 CET

After reading the source code of rake for a while, I realized that you need to call Rake :: Application # init to initialize the newly created rake application:

 rake = Rake::Application.new rake.init rake.load_rakefile 

However, I still cannot invoke any tasks defined in my Rakefile:

 rake.top_level_tasks # => ["default"] 

I will be happy to take care of any help in this matter.

+13
ruby rake
May 18 '11 at 22:27
source share
2 answers

You forgot to add your new rake to your current Rake app:

 $LOAD_PATH.unshift File.dirname(__FILE__) require 'rake' require 'pp' rake = Rake::Application.new Rake.application = rake rake.init rake.load_rakefile rake[:hello].invoke 

or simply

 $LOAD_PATH.unshift File.dirname(__FILE__) require 'rake' require 'pp' Rake.application.init Rake.application.load_rakefile Rake.application[:hello].invoke 
+17
May 21 '11 at 12:28
source share

Just download the Rakefile:

 ==> foo.rb <== require 'rubygems' require 'rake' load 'Rakefile' Rake::Task[:some_task].invoke ==> Rakefile <== task :some_task do puts "some_task" end 

Rake :: Application - all about command line processing, default rakefiles, output, etc. You may not need this.

+10
Sep 18 '11 at 19:45
source share



All Articles