Rails 在 Heroku 上部署期间动态生成时钟文件(或任何文件)

Dynamically generating a clock file (or any file) during Rails deployment on Heroku

我使用 Clockwork gem 来安排我的 Rails 部署在 Heroku 上的应用程序的作业。

对于不熟悉的人,它基本上是从应用程序根目录中的 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 是否允许您在任何时候 "write" 一个文件到您的本地文件系统,以便我可以在初始化步骤中生成并写入 clock.rb 文件?

  2. 有没有办法延迟使用 bundle exec 命令启动 dyno 的执行,直到我创建了 clock.rb 文件?我可以从一个 fake/empty 文件开始,然后在初始化期间填充一个新文件,但我仍然需要一种方法让时钟通过重新启动 bundle exec clockwork... 命令来再次拾取它。

感谢任何其他有创意的解决方案。

谢谢!

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 上设置和读取环境变量。