是否可以从其他ruby脚本调用在Rakefile-而不是somefile.rake中定义的任务?
我希望创建一个新的Rake::Application将自动从同一目录加载Rakefile,但似乎不是这样。以下是我到目前为止想到的:

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

rake = Rake::Application.new
rake[:hello].invoke

执行此代码将导致以下结果:
/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产生以下结果:
#<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>

令人恼火的是@rakefilenil
更新时间:5月20日下午4:40
在阅读了rake源代码一段时间后,我发现需要调用rake::application init来初始化新创建的rake应用程序:
rake = Rake::Application.new
rake.init
rake.load_rakefile

但是,我仍然无法调用rakefile中定义的任何任务:
rake.top_level_tasks # => ["default"]

我很高兴能在这件事上得到帮助。

最佳答案

您忘记将新的rake添加到当前rake应用程序:

$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

或者只是
$LOAD_PATH.unshift File.dirname(__FILE__)
require 'rake'
require 'pp'

Rake.application.init
Rake.application.load_rakefile

Rake.application[:hello].invoke

07-24 12:32