【问题标题】:Dynamically generating a clock file (or any file) during Rails deployment on Heroku在 Heroku 上的 Rails 部署期间动态生成时钟文件(或任何文件)
【发布时间】: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。这让我可以根据环境配置等灵活地安排或不安排某些任务......

  1. Heroku 是否允许您在任何时候将文件“写入”到本地文件系统,以便我可以在初始化步骤中生成并写入 clock.rb 文件?

  2. 有没有办法延迟使用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


【解决方案1】:

config.rb 只是 Ruby。不需要ERB,纯Ruby 结合ENV 变量应该足以解决您的问题:

# Schedule every `ENV['schedule_time']` (with fallback if empty)
schedule_time = ENV['schedule_time'].presence || 'Monday 13:00'
every(1.week, "some description", at: schedule_time, tz: "UTC") {
  `rake clock_tasks:my_task`
}

或者你可以这样写:

if ENV[`foo`]
  # config bar
else
  # config baz
end

您可能想阅读Configuration and Config Vars,了解如何在 Heroku 上设置和读取环境变量。

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 2014-06-08
    • 2021-09-17
    • 2016-04-16
    • 1970-01-01
    • 2021-11-05
    • 2016-03-11
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多