我有一个 Rails 任务: 我应该使用 script/runner 还是 rake?

对于 临时的 Rails 任务,我们有一些实现方案,其中最主要的似乎是:

script/runner some_useful_thing

以及:

rake some:other_useful_thing

我应该选择哪一个?如果有一个明确的最爱,那么什么时候,如果曾经,我应该考虑使用其他?如果从来没有,那么为什么要假设它仍然存在于框架中而没有弃用警告呢?

34494 次浏览

对于一个关闭的命令脚本/运行程序可以很好。对于任何重复的任务,rake 任务从长远来看都更容易,如果您忘记了它的作用,它还有一个摘要。

我得到的印象是,script/runner 主要用于定期任务,例如,运行的 cron 作业:

SomeClass.update_from_web('http://www.sourcefordata.gov/')

它们之间的区别在于,script/runner引导 Rails,而 Rake 任务不引导 Rails,除非你让任务依赖于 :environment,比如:

task :some_useful_task => :environment do
# do some useful task
end

由于引导 Rails 代价很高,所以如果可以避免的话,跳过它可能是值得的。

除此之外,它们大体上是等价的。我两者都用,但最近我更多地使用 script/runner分别执行脚本。

我所做的一件事就是编写普通的 Ruby 脚本,并将它们放在 script/maintenance目录中。

所有你需要做的加载轨道和访问所有的模型,等等,把 require '../../config/environment.rb'在你的文件的顶部,然后你离开。

FWIW 似乎有一些 远离使用脚本运行程序的移动支持 rake:

更新(4/25/2009) : 我建议使用 rake 任务,而不是脚本/运行程序来执行重复性任务。

另外,作为 根据这篇文章,你可以使用 rake 来完成重复性的任务:

如果我想让它在午夜时分在我的生产数据库上运行,我可能会写一个这样的 cronjob:

00 * * * cd/var/www/apps/ails _ app/& &/usr/local/bin/rake RAILS _ ENV = production utils:

根据第2条评论更正,给他们报应吧!

FWIW-Rails 3.0 + 改变了在独立脚本中初始化 Rails 系统的方式。

require File.dirname(__FILE__) + '/config/environment'

如上所述,你也可以这样做:

rails runner script/<script name>

或者将所有代码放在 Rake 任务中,但是我有很多 Rails 2的遗留代码; 所以我不想立即沿着这条路走下去。

每种方法都有其优点和缺点。

在 Rails 3.0 + 中,config/environment.rb需要 config/application.rb,而 config/boot.rb需要 config/application.rb

因此,要在 Rails 3中加载应用程序,您仍然只需要使用 environment.rb

至少可以说,向 rake 任务传递参数是件痛苦的事情。您要么需要求助于环境变量,要么需要一个非常蹩脚的参数系统,这个系统不直观,而且有很多警告。

如果您的任务需要优雅地处理命令行参数,那么可以编写脚本。

Luke Francl 提到了脚本/运行程序启动 Rails。那倒是真的。但是如果你不想启动 Rails,那么就像没有 script/runner 那样运行脚本。因此,脚本和 rake 任务之间唯一真正的区别在于它们的美学。选择你觉得合适的。

我使用 rake 任务来完成小任务(一行或两行)。任何更复杂的内容都会进入 script/目录。如果我认为其他开发人员希望代码生活在一个地方而不是另一个地方,那么我将打破这个规则。