如何从其他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>
令人恼火的是@rakefile
是nil
。
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,输出等等。您可能不需要任何这些。