问题 如何使用Rails发条宝石来运行rake任务?


从发条中调用rake任务的语法是什么?我尝试过各种语法,似乎没什么用。 (我对钟表工作特别感兴趣,因为Heroku支持它。)

这是我的clock.rb,使用的是when gem使用的相同语法:

module Clockwork
  puts "testing clockwork!"
  every(30.seconds, 'Send Messages') {
    rake 'scheduler:send_messages'
    }
end

这是我在scheduler.rake中的rake任务:

task :send_messages => :environment do
  puts "rake task run successfully!"
end

这就是我开始发条过程时会发生的事情:

$ clockwork lib/clock.rb
testing clockwork!
I, [2012-07-16T14:42:58.107245 #46427]  INFO -- : Starting clock for 1 events: [ Send Messages ]
I, [2012-07-16T14:42:58.107364 #46427]  INFO -- : Triggering 'Send Messages'
attempting to run rake task!
E, [2012-07-16T14:42:58.107437 #46427] ERROR -- : undefined method `rake' for Clockwork:Module (NoMethodError)

每30秒运行一次。如您所见,clock.rb已成功执行。但我不能为我的生活找出运行rake任务的语法。遗憾的是,钟表机构自述文件无济于事:

https://github.com/tomykaira/clockwork


11951
2017-07-16 21:47


起源

浏览了clockworks自述文件后,它无处使用您正在使用的语法(rake 'some:task) - Lee Jarvis
是的,事实上它根本没有提供语法的例子。我已经尝试了cron语法(rake some:task),以及随时的语法(rake'ome:task')并且没有骰子。看看描述如何写“发条是一个替代品”。你认为其中一个会起作用。 - user1377556
为什么不使用Heroku调度程序? - janders223
如果必须,我会,但Heroku调度程序不会超出某一点,我想放置一些可以扩展的东西。 - user1377556
另外,我无法在我的开发机器上测试Heroku调度程序。我已经尝试过使用随时随地的gem,但是没有关于如何在开发机器上使用的说明。 - user1377556


答案:


rake 不是一个方法,所以你不能在这里调用它。

你可以弹出并调用它,比如

every(30.seconds, 'Send Messages') {
  `rake scheduler:send_messages`
}

或者更确切地说,使用heroku API调用一个新的分离进程。这是我现在的首选方法:

Heroku::API.new.post_ps('your-app', 'rake scheduler:send_messages')

Heroku :: API可从heroku.rb获得: https://github.com/heroku/heroku.rb


9
2017-07-17 04:27



好的,使用该语法不再有错误消息,但它实际上并不运行rake任务。我在部署时肯定会使用Heroku API,但是现在我需要在本地计算机上进行一些测试,以确保rake任务正确访问数据库。谢谢 - user1377556
你可以使用调用rake任务 heroku run rake scheduler:send_messages 从你的shell,看到你的任务打印到stdout的任何输出。你也可能需要一个捆绑exec - hgmnz
试着让它在我的本地机器(OSX)上运行。当我跑 $ bundle exec rake send_messages 从项目目录中,它正确运行rake任务。为什么它没有从发条运行rake任务是一个谜。 - user1377556
当你跑步时会发生什么 heroku run rake scheduler:send_messages?这将在heroku dyno上运行,与之相同 Heroku::API 我提出的方法会 - hgmnz
这有没有解决?我有类似的问题w /语法:(stackoverflow.com/questions/13465869/...) - dougiebuckets


您可以将以下方法添加到您的 clock.rb 文件:

def execute_rake(file,task)
require 'rake'
rake = Rake::Application.new
Rake.application = rake
Rake::Task.define_task(:environment)
load "#{Rails.root}/lib/tasks/#{file}"
rake[task].invoke
end

然后打电话

execute_rake("your_rake_file.rake","your:rake:task")

在你的处理程序中


3
2017-07-03 10:21



如何在不引用文件的情况下执行delayed_job rake任务?例如。 rake jobs:work - Kelsey Hannan
@Kelseydh我正在尝试做同样的事情。你有没弄明白怎么做? - webdevguy
@webdevguy可能不是你正在寻找的东西,但这是让我可以通过发条来完成rake任务的答案: stackoverflow.com/a/29340040/3448554 - Kelsey Hannan


你可以传入一个块 every 执行你的rake任务:

every(1.day, "namespace:task") do
  ApplicationName::Application.load_tasks
  Rake::Task['namespace:task'].invoke
end

3
2017-12-19 03:11



在rails 3.1上没有为我工作。 - Kelsey Hannan
使用这种方法时,记得要求你的application.rb文件:require_relative'./ application'(如果是config.config / clock.rb下的clock.rb),这行应该在模块外面说明 - tomascharad