【问题标题】:Rails - execute rake task at initializationRails - 在初始化时执行 rake 任务
【发布时间】:2015-05-22 18:11:20
【问题描述】:

我想在服务器启动时执行两个初始化我的数据库的 rake 任务。 因此,我将以下代码放在config/application.rb

config.after_initialize do
      Rake::Task[ 'download_csv:get_files' ].invoke
      Rake::Task[ 'download_csv:place_in_database' ].invoke
end

但是,我收到以下错误:

.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/rake/task_manager.rb:62:in `[]': Don't know how to build task 'download_csv:get_files' (RuntimeError)

我做错了什么? (我的目标是在启动时初始化数据库)。

【问题讨论】:

  • 显示 rake 文件名........我敢肯定,您将 rake 文件扩展名设置为 .rb.. 将它们更改为 .rake.. 它会起作用..
  • 粘贴rake -T download_csv的输出
  • Arup 文件名是“download_csv.rake”、“query_api.rake”。 Pawel 没有输出。
  • 你应用的哪个目录下有这些文件?

标签: ruby-on-rails rake


【解决方案1】:

Rails 任务不会自动加载,需要先加载:

config.after_initialize do
  Rails.application.load_tasks # <---
  Rake::Task['download_csv:get_files'].invoke
  Rake::Task['download_csv:place_in_database'].invoke
end

请注意,#load_tasks 不存储状态,如果您在其他地方再次调用它,您可能会遇到问题。

另一方面,任务的名称表明它们不需要在每个 Web 实例上运行(例如 Heroku Dynos);但它们将使用上述策略在每台机器上运行。因此,如果您已经扩展了 Web 实例(在多台机器上运行您的应用程序),那么在单个实例中运行这些任务(Heroku 上的一次性 Dyno)作为自动化的部署后任务会更有效。

【讨论】:

    【解决方案2】:

    download_csv:place_in_database 表示在命名空间download_csv 中有一个名为place_in_database 的任务。这是您的 Rake 任务的外观吗?如果您发布代码,将更容易诊断问题。

    另外,请确保您的 .rake 文件驻留在 lib/tasks 中。

    【讨论】:

      猜你喜欢
      • 2011-10-11
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多