如何从其他Ruby脚本调用标准Rakefile中定义的Rake任务?

是否可以从其他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 `' 

pp rake产生以下结果:

 #<Rake::Application:0x00000101118da0 @default_loader=#, @imported=[], @last_description=nil, @loaders= {".rb"=>#, ".rf"=>#, ".rake"=>#}, @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 

只需加载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是关于命令行处理,默认rakefiles,输出等等。您可能不需要任何这些。