【问题标题】:How to call Rake tasks that are defined in the standard Rakefile from an other Ruby script?如何从其他 Ruby 脚本调用标准 Rakefile 中定义的 Rake 任务?
【发布时间】:2011-08-28 10:47:30
【问题描述】:

是否可以从其他 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"]

我很乐意在这件事上提供任何帮助。

【问题讨论】:

标签: ruby rake


【解决方案1】:

您忘记将新的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

【讨论】:

  • 天才和准时。我开始认为我可能不得不使用像system rake ... 这样的东西,但现在我可以使用你的这个更清洁的解决方案。非常感谢!
  • 很好的解决方案,虽然它需要稍微修改以支持带有参数的任务。在这里查看我的答案:stackoverflow.com/questions/13858495/…
【解决方案2】:

只需加载 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、输出等。你可能不需要这些。

【讨论】:

  • 谢谢,这解决了我的问题。我假设 Rakefile 会在 Rails 中默认加载,但事实并非如此。
猜你喜欢
  • 2011-05-29
  • 2013-02-18
  • 2018-02-25
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
相关资源
最近更新 更多