我正在尝试创建一个调用另外两个rake任务的Rake任务。我找到了有相关问题here和here的人,但它并不是很有用。这是我到目前为止拼凑的东西。知道我做错了什么吗?
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;博士:错别字。
答案 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