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

Mik*_*use 66 ruby rake ruby-on-rails

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

script/runner some_useful_thing
Run Code Online (Sandbox Code Playgroud)

和:

rake some:other_useful_thing
Run Code Online (Sandbox Code Playgroud)

我更喜欢哪个选项?如果有一个明显的喜欢那么,如果有的话,我应该考虑使用另一个?如果从来没有,那么为什么你认为它仍然存在于没有弃用警告的框架中?

Luk*_*ncl 59

它们之间的区别在于script/runner引导Rails而Rake任务没有,除非你通过让任务依赖于它来告诉它:environment,如下所示:

task :some_useful_task => :environment do
  # do some useful task
end
Run Code Online (Sandbox Code Playgroud)

由于启动Rails很昂贵,如果可以避免它,可能值得跳过.

除此之外,它们大致相同.我使用两者,但最近我使用script/runner了更多单独执行脚本.


esi*_*ver 10

FWIW似乎有一些动作远离使用脚本运行器而不是 rake:

更新(2009年4月25日):我建议使用rake任务而不是脚本/运行器来执行重复任务.

此外,根据这篇文章,您可以使用rake进行重复性任务就好了:

如果我希望这个在午夜时分在我的生产数据库上运行,我可能会写一个看起来像这样的cronjob:

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

  • 我不确定一篇博文(遗憾的是它没有解释它的rake-vs-runner声称的原因)真的算是一个运动. (3认同)
  • 您的第一个链接已关闭,无法确定文章是否已被删除或仅重新安排了博客. (2认同)

Alf*_*zio 10

至少可以说,将参数传递给rake任务是一个痛苦的屁股.您需要求助于环境变量或非常讨厌的参数系统,这些参数系统不直观并且有很多警告.

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

Luke Francl提到脚本/跑者启动Rails.确实如此.但是,如果您不想启动rails,那么只需按原样运行脚本,而不使用script/runner.因此,脚本和rake任务之间唯一真正的区别在于它们的美学.选择适合自己的感觉.

我使用rake任务执行小任务(一行或两行).更复杂的东西进入脚本/目录.如果我认为其他开发人员希望代码在一个地方生活在另一个地方,我会打破这个规则.


Ben*_*ing 9

根据评论2进行更正.给他们业力!

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

require File.dirname(__FILE__) + '/config/environment'
Run Code Online (Sandbox Code Playgroud)

如上所述,您还可以:

rails runner script/<script name>
Run Code Online (Sandbox Code Playgroud)

或者将所有代码放在Rake任务中,但是我有很多来自Rails 2的遗留代码; 所以我不想马上走那条路.

每个都有其优点和缺点.


Ori*_*rds 5

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

您需要做的就是加载rails并访问所有模型等,将其放在require '../../config/environment.rb'文件的顶部,然后就可以了.

  • ^^澄清:耙子很棒,如果你需要依赖等我会使用它,但如果你不这样做,那么无缘无故再考虑一件事 (4认同)