Rails - 在初始化时执行rake任务

6
我希望在服务器启动时执行两个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。这样就可以工作了。 - Arup Rakshit
请返回 rake -T download_csv 的输出结果。 - Paweł Gościcki
Arup,文件名是“download_csv.rake”和“query_api.rake”。Pawel,没有输出。 - bsky
你的应用程序中这些文件在哪个目录下? - Andy Waite
2个回答

12

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

Rails任务没有自动装载,在运行任何任务之前,您需要使用以下命令进行手动加载:

rails app:tasks:load

请注意,在Rails 6.1及更高版本中,可以使用以下命令代替:

rails tasks:load

如果您尝试运行任务而没有先加载它们,则可能会看到“未定义的方法”错误。

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的自动部署任务)将更加有效。


1

download_csv:place_in_database 意味着在命名空间 download_csv 中有一个名为 place_in_database 的任务。你的 Rake 任务是这样的吗?如果您发布代码,诊断问题会更容易。

此外,请确保您的 .rake 文件位于 lib/tasks 目录中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接