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?
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.
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
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.
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.
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.
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
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/')
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.