如何从控制台运行rake任务?

122
我希望能够从控制台调用我的rake任务。这可行吗?如果可以,如何操作?
我在控制台上尝试了以下命令:
require 'rake'
Rake::Task['my_task'].invoke

但是它给我返回了这个错误:
RuntimeError: Don't know how to build task

就像耙子找不到任务一样。

任何帮助都将不胜感激。

谢谢

编辑:我正在使用Rails 2.3.5

5个回答

252

运行Rake任务需要两个步骤:

  1. 加载 Rake
  2. 加载您的 Rake 任务

你错过了第二步。

通常这是在Rakefile中完成的,但是你必须在这里手动完成:

require 'rake'
Rails.application.load_tasks # <-- MISSING LINE
Rake::Task['my_task'].invoke

2
如需更多选项,请参考https://dev59.com/1XRB5IYBdhLWcg3wl4Kc。 - Jahan Zinedine
9
请注意在使用.invoke.execute时的区别,如果您需要多次运行任务(例如数据完整性检查器并且应用程序启动时间过长),则建议使用.execute来运行任务。 - mu is too short
5
如果需要传递参数,请在调用方法中这样做:.invoke(arg1, arg2,...) - Nuno Silva
这是在应用程序内部运行Rake任务的最佳方法吗?(例如,每次测试套件运行时我都会运行db:seed来重新填充数据库。我使用了上面的代码,它可以工作,只是想知道是否最佳实践或是否有其他方法?) - stevec

18

最简单的方法是从irb中运行%x[command]。不过我不确定你想要实现什么。

%x[rake db:migrate]

编辑:我强烈建议使用被Daniel在被采纳的答案中提到的.invoke


1
问题在于,rake似乎无法识别我的任务。你有什么想法? - Fajarmf
它完美地运行了,@garno!抱歉我知道已经过去一年了,突然间我又遇到了同样的需求。 - Fajarmf
2
如果您愿意,也可以用反引号将其括起来。 - Sam Soffes
这很慢,因为它必须启动一个新进程并再次实例化您的Rails应用程序。invoke更好、更高效。 - Joshua Pinter

17

简单的方法是:

Rails.application.load_tasks
Rake::Task['my_task'].invoke

1
这不仅是简单的方法,而且意味着您不需要启动新进程并再次实例化Rails应用程序。简单又快速! - Joshua Pinter

7

我正在使用rails 5.x.x,并且需要在rails控制台中执行相同的操作。
我已经创建了一个rake任务-

app/lib/task_to_execute.rake

以下是我为您翻译的内容:

这是对我有效的命令-

加载Rails.application.load_tasks

Rake::Task['task_to_execute:task_name'].invoke

这对我有用!


2

请注意,如果您通过rails c进入Rails控制台,则可以通过irb(main):001:0> TaskClassName.new.my_task直接调用/运行rake任务方法。


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