Comment exécuter des commandes dans les tâches Rake?
-
01-10-2019 - |
Question
J'ai les tâches de râteau dans mon application rails. Je veux lancer une commande en ligne de commande avec dans la tâche de râteau. Comment puis-je faire ceci. J'ai essayé par la suite mais ne parvient
desc "Sending the newsletter to all the users"
task :sending_mail do
run "cd #{RAILS_ROOT} && ar_sendmail -o -t NewsLetters -v"
system "cd #{RAILS_ROOT} && ar_sendmail -o -t NewsLetters -v &"
end
La commande ci-dessus run plaids méthode run non définie et commande système ne jette pas des erreurs mais pas exécutée.
La solution
Ce lien peut vous aider à exécuter la commande de ligne de commande en ruby ??...
http: // zhangxh. net / programmation / rubis / 6-voies à fonctionner-shell-commandes-en-ruby /
appel commandes de shell de Ruby
http: //blog.jayfields .com / 2006/06 / ruby-kernel-système-exec-et-x.html
%x[command].each do |f|
value = f
end
Autres conseils
sh
rake intégré est probablement la meilleure méthode:
task(:sh) do
sh('echo', 'a')
sh('false')
sh('echo', 'b')
end
L'interface est similaire à Kernel.system
mais:
- avorte si le retour est! = 0, donc l'atteint ci-dessus ne
echo b
- la commande elle-même est repris avant que la sortie
run
est utilisé par Capistrano et d'autres choses pour lancer des commandes, mais Rake a souvent recours à des Kernel#system
à la place.
Votre commande peut être en cours d'exécution, mais ne fonctionne pas. Pourquoi ne pas faire un script shell d'emballage, vous pouvez tester de façon indépendante, ou essayer de coup d'envoi en utilisant le chemin complet:
newsletter_script = File.expand_path('ar_sendmail', RAILS_ROOT)
if (File.exist?(newsletter_script))
unless (system(newsletter_script + ' -o -t NewsLetters -v &'))
STDERR.puts("Script #{newsletter_script} returned error condition")
end
else
STDERR.puts("Could not find newsletter sending script #{newsletter_script}")
end
Il semble étrange d'avoir votre script pas dans scripts/
L'appel system
devrait revenir true
sur le succès. Si ce n'est pas le cas, que ce soit le script a retourné un code d'erreur, ou la commande could't être exécutée.