一般来说,您的解决方案应该有效:
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