Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call Rake tasks that are defined in the standard Rakefile from an other Ruby script?

Tags:

ruby

rake

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

I was hoping that creating a new Rake::Application would automatically load the Rakefile from the same directory, but it seems that this is not the case. 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

Executing this code results in 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 yields 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>

It is somehow irritating that @rakefile is nil.

Update May 20th, 4:40pm CET

After reading the rake source code for a little while, I figured out that you need to call Rake::Application#init in order to initialize your 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'd gladly appreciate any help on that matter.

like image 966
t6d Avatar asked May 18 '11 22:05

t6d


People also ask

How do I run a rake task in Ruby on Rails?

Go to Websites & Domains and click Ruby. After gems installation you can try to run a Rake task by clicking Run rake task. In the opened dialog, you can provide some parameters and click OK - this will be equivalent to running the rake utility with the specified parameters in the command line.

What is a Ruby rake task?

Rake is a popular task runner for Ruby and Rails applications. For example, Rails provides the predefined Rake tasks for creating databases, running migrations, and performing tests. You can also create custom tasks to automate specific actions - run code analysis tools, backup databases, and so on.

Where are Rake tasks located?

In any Rails application you can see which rake tasks are available - either by running rake -AT (or rake --all --tasks) to see all tasks, or rake -T (or rake --tasks ) to see all tasks with descriptions.


1 Answers

You forgot to add your new rake to the current Rake Application:

$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 just

$LOAD_PATH.unshift File.dirname(__FILE__)
require 'rake'
require 'pp'

Rake.application.init
Rake.application.load_rakefile

Rake.application[:hello].invoke
like image 118
Vasiliy Ermolovich Avatar answered Oct 19 '22 22:10

Vasiliy Ermolovich