我有一个Rails任务:应该使用脚本/运行器还是耙子?


67

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

script/runner some_useful_thing

和:

rake some:other_useful_thing

我应该选择哪个选项?如果有明确的偏爱,那么我何时应该考虑使用另一个?如果从来没有,那么您为什么会认为它仍然存在于框架中而没有弃用警告?

Answers:


60

它们之间的区别是script/runner引导Rails,而Rake任务则不会启动,除非您通过使任务依赖于Rake来告诉它:environment,如下所示:

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

由于引导Rails的成本很高,因此如果可以避免的话,可能值得跳过。

除此之外,它们大致相等。我两者都用,但是最近我习惯script/runner了分别执行脚本。


10

至少可以说,将参数传递给rake任务是一个麻烦。您要么需要求助于环境变量,要么需要使用非常笨拙的参数系统,该系统不直观且有很多警告。

如果您的任务需要优雅地处理命令行参数,那么编写脚本是您的最佳选择。

Luke Francl提到脚本/运行程序启动Rails。确实如此。但是,如果您不想启动rails,则只需按原样运行脚本即可,而无需脚本/运行器。因此,脚本和耙任务之间的唯一真正区别是它们的美观。选择适合您的事物。

我将rake任务用于小任务(一两行)。任何更复杂的内容都进入script /目录。如果我认为其他开发人员会期望代码位于一个地方而不是另一个地方,那么我将打破此规则。


10

FWIW使用脚本运行程序来支持rake似乎有些偏离

更新(4/25/2009):对于重复执行的任务,我建议使用rake任务,而不是脚本/运行器。

另外,根据这篇文章,您可以使用rake进行重复任务:

如果然后我希望它在午夜在生产数据库上每晚运行,那么我可能会编写一个类似于以下内容的cronjob:

0 0 * * * cd / var / www / apps / rails_app / && / usr / local / bin / rake RAILS_ENV = production utils:send_expire_soon_emails


2
您的第一个链接已死,不确定文章是否已删除或只是重新排列了博客。
重力风暴

3
我不确定单个博客帖子(不幸的是,这并不能解释这是rake-vs-runner声称的原因)是否真的可以算作是运动。
David Ljung Madison Stellar

9

根据注释2向下进行更正。给他们业力!

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

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

如上所述,您还可以执行以下操作:

rails runner script/<script name>

或将所有代码放入Rake任务中,但是我有很多来自Rails 2的遗留代码;所以我不想立即走这条路。

每种都有其优点和缺点。


5

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

加载滑轨并访问所有模型等所需要做的一切都放在require '../../config/environment.rb'文件的顶部,然后您就可以离开了。


将它们放入rake任务是否更有意义?
Daniel Morris

1
为什么要为瑞克任务增加复杂性而烦恼。这样,我们只有一个文件可以像在* nix系统上任何其他脚本一样运行
Orion Edwards 2009年

4
澄清一下:^^:Rake非常好,如果需要依赖等,我会用它,但是如果不需要,就可以毫无考虑地思考这件事
Orion Edwards

并且比您升级rails版本,还需要管理environment.rb位置的“私有”细节。
JAR.JAR.beans 2015年

3

对于一个关闭命令,脚本/运行程序就可以了。对于重复的任何事情,从长远来看,瑞克任务比较容易,如果您忘记了它的作用,则有摘要。


3

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

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


2

我得到的印象脚本/运行程序主要用于定期任务。例如,执行以下任务的cron作业:

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

1
我从没有见过的runner任务要求或暗示它主要用于cron作业。取而代之的是,我考虑将跑步者用于不需要Rails表示层但想要访问数据库和模型的任务,并且我不会将其放入控制器或模型中,因为将其放置在这里没有意义。
锡人
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.