J’ai une tâche Rails: dois-je utiliser un script / runner ou un rake?

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

script/runner some_useful_thing 

et:

 rake some:other_useful_thing 

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

La différence entre eux est que le script/runner démarre Rails alors qu’une tâche Rake ne le fait pas à moins que vous ne le disiez en faisant dépendre la tâche:

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

Le démarrage de Rails étant coûteux, il peut être utile de sauter si vous pouvez l’éviter.

À part cela, ils sont à peu près équivalents. J’utilise les deux, mais dernièrement, j’ai utilisé script/runner exécuter un script séparément.

FWIW, il semble y avoir un certain mouvement pour utiliser le script runner en faveur de rake:

Mise à jour (25/04/2009): Je recommande d’utiliser les tâches de rake par opposition aux scripts / runner pour les tâches récurrentes.

En outre, conformément à cet article, vous pouvez utiliser rake pour les tâches récurrentes très bien:

Si je voulais ensuite que cela fonctionne tous les soirs sur ma firebase database 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

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

FWIW – Rails 3.0+ modifie 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/ 

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 aller dans cette voie immédiatement.

Chacun a ses avantages et désavantages.

Passer des parameters à une tâche de ratissage est une douleur pour le moins. Vous avez soit besoin de recourir à des variables d’environnement, soit à un système de parameters très pirate qui n’est pas intuitif et comporte de nombreuses réserves.

Si votre tâche doit gérer les arguments de la ligne de commande, l’écriture d’un script est la voie à suivre.

Luke Francl mentionne un script / un coureur qui lance Rails. C’est vrai. Mais si vous ne voulez pas démarrer de rails, lancez simplement le script sans script / runner. La seule vraie différence entre les scripts et les tâches de rake réside donc dans leur esthétique. Choisissez ce qui vous convient le mieux.

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

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

Tout ce que vous avez à faire pour charger des rails et accéder à tous vos modèles, etc, est mis en place require '../../config/environment.rb' en haut de votre fichier, alors vous êtes absent.

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

Donc, pour charger une application dans Rails 3, il vous suffit d’exiger l’ environment.rb

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 contient un résumé si vous oubliez ce qu’elle fait.

J’ai eu le script d’impression / coureur était principalement pour des tâches périodiques. Par exemple, un travail cron qui s’exécute:

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