【发布时间】:2016-01-08 17:30:28
【问题描述】:
我使用 Clockwork gem 在我的使用 Heroku 部署的 Rails 应用程序上安排作业。
对于不熟悉的人,它基本上是从您的应用根目录中的clock.rb 文件中读取的。
# config.rb
# Schedule every Monday @ 13:00 UTC
every(1.week, "some description", at: "Monday 13:00", tz: "UTC"){
`rake clock_tasks:my_task`
}
...并且有一个专用的 Dyno 运行时钟进程。
# Procfile
...
clock: bundle exec clockwork clock.rb
...
如果我不想硬编码时钟文件怎么办?我希望能够在应用启动时使用 ERB 动态生成clock.rb。这让我可以根据环境配置等灵活地安排或不安排某些任务......
Heroku 是否允许您在任何时候将文件“写入”到本地文件系统,以便我可以在初始化步骤中生成并写入
clock.rb文件?有没有办法延迟使用
bundle exec命令启动测功机,直到我创建了clock.rb文件之后?我可以从一个假/空文件开始,然后在初始化期间填充一个新文件,但我仍然需要一种方法让时钟通过重新启动bundle exec clockwork...命令来重新拾取它。
赞赏任何其他创造性的解决方案。
谢谢!
【问题讨论】:
-
我认为更明智的解决方案是在您的
clock.rb文件中使用环境变量。 -
对于小型实现来说,这是一个公平的解决方案。对于更大更动态的实现,我们不想堆积使用 100 多个 ENV 变量或有类似“如果 ENV 变量 == foo,添加这个”之类的逻辑。问题的核心是 Heroku 能否支持这样的东西。
-
您可以在运行时将文件写入您的 heroku slug,这不是问题。动态生成文件听起来像是一个冒险的提议——你会因为知道你推送的代码是实际运行的代码而失去了内心的平静。而且由于 Heroku 不提供直接的 shell 访问,因此很难看到实际运行的代码是什么。如果您的项目确实像您所说的那样大,那么您应该将任务定义为服务对象或模型,并让最终用户可以通过 env vars 或 UI 来切换它们。
-
加上 heroku 实际上有插件来运行预定的作业 - 所以使用发条可能是解决问题的最笨拙的方法。 devcenter.heroku.com/articles/scheduler
-
这是 ruby 代码,它的动态能有多少?我很难想象如果它是 erb,你可以更轻松地做任何事情......
标签: ruby-on-rails ruby heroku clockwork