Rails app Rake任务不知道如何构建其他Rake任务

时间:2012-06-23 15:08:17

标签: ruby-on-rails ruby rake rake-task

我正在尝试创建一个调用另外两个rake任务的Rake任务。我找到了有相关问题herehere的人,但它并不是很有用。这是我到目前为止拼凑的东西。知道我做错了什么吗?

task :cron => :environment do
  #if Time.now.hour % 2  == 0 
    Rake::Task["robots:update_robots"].reenable
    Rake::Task["robots:update_robots"].invoke
  #end
end

正如你所看到的,这是一个专为Heroku做的cron工作。但我已经注释掉了我不需要的东西,所以我可以测试它是否正常工作。

我一直收到这个错误:

  

不知道如何构建任务'robots:update_robots'

但我不知道为什么。

更新:所以我发现我无法运行我的cron rake任务调用的原始任务。我让它运行了一段时间,沿着线路购买,我删除了“更新”中的“d”。所以这个命令     耙::任务[“机器人:upate_robots”。执行 没有,因为机器人耙任务是“upate”,而不是“更新”。

Tl;博士:错别字。

1 个答案:

答案 0 :(得分:3)

通常,您的解决方案应该有效:

require 'rake'

task :environment do
  puts 'task environment'
end

namespace :robots do
  task :update_robots do
    puts "task robots:update_robots"
  end
end

task cron: :environment do
  puts 'task cron'
  Rake::Task['robots:update_robots'].reenable
  Rake::Task['robots:update_robots'].invoke
end

Rake::Task['robots:update_robots'].invoke
Rake::Task[:cron].invoke

# >> robots:update_robots was invoked
# >> task robots:update_robots
# >> task environment
# >> task cron
# >> task robots:update_robots

我的第一个想法是你必须让rake任务出错(你确定它是“robots:update_robots”吗?)

我不需要重新启用它,这意味着你想要的不是Rake,而只是普通的Ruby。将update_robots任务的内容移出到一个方法,然后您可以直接调用该方法,而不是尝试处理方法之类的任务(任务用于处理依赖关系,它们只是故意调用一次,而你需要弯曲它们意味着你'为工作重新使用错误的工具)。然后,您的代码和机器人:update_robots都可以调用相同的方法:

require 'rake'

def update_robots
  puts "method update_robots"
end

task :environment do
  puts 'task environment'
end

namespace :robots do
  task :update_robots do
    update_robots
    puts "task robots:update_robots"
  end
end

task cron: :environment do
  puts 'task cron'
  update_robots
end

Rake::Task['robots:update_robots'].invoke
Rake::Task[:cron].invoke

# >> method update_robots
# >> task robots:update_robots
# >> task environment
# >> task cron
# >> method update_robots