2010-09-08 19 views
13

J'ai les tâches de rake dans mon application rails. Je veux lancer une commande en ligne de commande avec une tâche en rake. Comment puis-je faire ceci. J'ai essayé par ce qui suit mais ne parvientComment exécuter des commandes dans les tâches Rake?

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 undefined & commande du système de ne pas jeter des erreurs mais pas exécuté.

Répondre

5

Ce lien peut vous aider à exécuter la commande de ligne de commande en rubis ...

http://zhangxh.net/programming/ruby/6-ways-to-run-shell-commands-in-ruby/

Calling shell commands from Ruby

http://blog.jayfields.com/2006/06/ruby-kernel-system-exec-and-x.html

%x[command].each do |f| 
    value = f 
end 
+0

Rake a une méthode spécifique pour exécuter une commande shell,' # sh'. Il a le défaut d'utiliser '/ bin/sh', pas bash cependant. Pour utiliser bash de la méthode' sh' de Rake, voir cette réponse à une question en double: https: // stackoverflow.com/questions/9796028/execute-bash-commandes-from-a-rakefile/34523379 # 34523379 –

5

run est utilisé par Capistrano et d'autres choses pour lancer des commandes, mais Rake utilise souvent Kernel#system à la place.

Votre commande est 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 semblerait étrange d'avoir votre script pas scripts/

L'appel system doit retourner true en cas de succès Si ce n'est pas le cas, le script a renvoyé un code d'erreur ou la commande n'a pas pu être exécutée.

+0

Salut tadman, Merci pour votre réponse ... je viens de copier votre code et essayé mais ne fonctionne pas comme prévu.pouvez-vous s'il vous plaît dites-moi ce que File.expand_path faire? – palani

+0

Bonjour tadman, votre script recherche le fichier Rails_Root/ar_sendmailer. mais ce n'est pas un fichier et c'est une commande qui a été invoquée à partir du dossier racine de l'application Rails. comme [/ home/nom d'utilisateur/railsapp] $ ar_sendmail -o -t NewLetter -V. donc je rake fichier je vais le dossier racine de l'application Rails et déclencher la commande ci-dessus que ce dont j'ai besoin ... s'il vous plaît aidez-moi sur ce – palani

+0

'File.expand_path' est utilisé pour ... élargir les chemins, fondamentalement. Il rejoindra correctement deux chemins ensemble, comme l'ajout de 'ar_sendmail' sur votre chemin Rails, quel qu'il soit. C'est aussi bon pour éliminer des choses comme "../../" lorsque cela est nécessaire, en vous donnant le bon chemin complet. – tadman

26

Le 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:

  • il avorte si le retour est = 0, de sorte que le plus haut atteint jamais echo b
  • la commande elle-même est repris avant la sortie
  • !
+1

Semble aussi la meilleure méthode pour moi –