2

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

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”。所以这个命令 Rake::Task["robots:upate_robots"].execute 没有因为机器人 rake 任务是“upate”,而不是“update”。

Tl;博士:错别字。

4

1 回答 1

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 任务的内容移出一个方法,然后您可以直接调用该方法,而不是尝试将任务视为方法(任务用于处理依赖关系,它们只故意调用一次,并且您需要弯曲它们意味着您重新使用了错误的工具来完成这项工作)。然后,您的代码和 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
于 2012-06-23T16:03:20.327 回答