web-dev-qa-db-fra.com

J'ai une tâche Rails: dois-je utiliser un script / runner ou un râteau?

Pour ad hoc Rails tâches, nous avons quelques alternatives d'implémentation, dont les principales semblent être:

script/runner some_useful_thing

et:

rake some:other_useful_thing

Quelle option dois-je préférer? S'il y a un favori clair, quand, si jamais, devrais-je envisager d'utiliser l'autre? Si jamais, alors pourquoi supposeriez-vous qu'il est toujours présent dans le cadre sans avertissements de dépréciation?

65
Mike Woodhouse

La différence entre eux est que script/runner boots Rails contrairement à une tâche Rake sauf si vous le lui demandez en faisant dépendre la tâche de :environment, comme ça:

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

Depuis le démarrage Rails est cher, il peut être utile de l'ignorer si vous pouvez l'éviter.

En dehors de cela, ils sont à peu près équivalents. J'utilise les deux, mais j'ai récemment utilisé script/runner exécuter un script séparément plus.

58
Luke Francl

FWIW il semble y avoir un certain s'éloigner de l'utilisation du script runner en faveur du rake:

Mise à jour (25/04/2009): Je recommande d'utiliser les tâches de râteau par opposition au script/runner pour les tâches récurrentes.

En outre, comme par cet article vous pouvez très bien utiliser le râteau pour les tâches récurrentes:

Si je voulais ensuite que cela fonctionne tous les soirs sur ma base de données de production à minuit, je pourrais écrire un cronjob qui ressemble à ceci:

0 0 * * * cd/var/www/apps/Rails_app/&&/usr/local/bin/rake Rails_ENV = utils de production: send_expire_soon_emails

10
esilver

Passer des paramètres à une tâche de râteau est une douleur dans le cul, c'est le moins qu'on puisse dire. Vous devez soit recourir à des variables d'environnement, soit à un système de paramètres très piraté qui n'est pas intuitif et comporte de nombreuses mises en garde.

Si votre tâche doit gérer les arguments de ligne de commande avec élégance, l'écriture d'un script est la solution.

Luke Francl mentionne le script/coureur démarrant Rails. C'est vrai. Mais si vous ne voulez pas démarrer Rails alors exécutez simplement le script tel quel sans script/runner. Donc la seule vraie différence entre les scripts et les tâches de rake est leur esthétique. Choisissez ce qui vous semble le mieux) à toi.

J'utilise des tâches de râteau pour de petites tâches (une ou deux lignes). Tout ce qui est plus compliqué va dans le répertoire script /. Je violerai cette règle si je pense que d'autres développeurs s'attendront à ce que le code vive à un endroit plutôt qu'à un autre.

9
Alfred Fazio

Corrigé sur la base du commentaire 2 vers le bas. Donnez-leur le karma!

FWIW - Rails 3.0+ change la façon dont vous initialisez le système Rails dans un script autonome).

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

Comme mentionné ci-dessus, vous pouvez également faire:

Rails runner script/<script name>

Ou mettez tout le code dans une tâche Rake, mais j'ai beaucoup de code hérité de Rails 2; donc je ne voulais pas emprunter ce chemin immédiatement.

Chacun a ses avantages et désavantages.

9
Ben Walding

Une chose que j'ai faite est d'écrire des scripts normaux Ruby et de les mettre dans le script/maintenance répertoire.

Tout ce que vous devez faire pour charger Rails et avoir accès à tous vos modèles, etc., est mis require '../../config/environment.rb' en haut de votre dossier, alors vous êtes absent.

5
Orion Edwards

Dans Rails 3.0+, le config/environment.rb nécessite le config/application.rb, qui nécessite le config/boot.rb.

Ainsi, pour charger une application dans Rails 3, il vous suffit de demander le environment.rb

3
ppires

J'ai eu l'impression que le script/runner était principalement destiné à des tâches périodiques. Par exemple, un travail cron qui s'exécute:

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

Pour une commande unique, le script/runner peut convenir. Pour tout ce qui se répète, une tâche de râteau est plus facile à long terme et a un résumé si vous oubliez ce qu'elle fait.

2
Daniel Morris