2010-09-08 13 views
13

Tengo las tareas de rake en mi aplicación de rieles. Quiero ejecutar comandos de línea de comando con la tarea de rake. Cómo puedo hacer esto. He intentado por el siguiente pero no¿Cómo ejecutar comandos dentro de las tareas de 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 

El orden de marcha por encima de tiros undefined & Comando de sistema no tirar ningún error pero no ejecuta el método de gestión.

Respuesta

5

Estos links pueden ayudarle a ejecutar comandos en la línea de comandos de rubí ...

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

El rastrillo tiene un método específico para ejecutar un comando de shell, '# sh'. Tiene el inconveniente de usar '/ bin/sh', no bash sin embargo. Para usar bash del método' sh' de Rake, vea esta respuesta a una pregunta duplicada: https: // stackoverflow.com/questions/9796028/execute-bash-commands-from-a-rakefile/34523379 # 34523379 –

5

run es utilizado por Capistrano y otras cosas para ejecutar comandos, pero Rake a menudo hace uso de Kernel#system en su lugar.

Su comando puede estar ejecutándose, pero no funciona. Por qué no hacer un shell script envoltorio se puede probar de forma independiente, o tratar de poner en marcha utilizando la ruta completa:

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 

parecería extraño tener la secuencia de comandos no en scripts/

La llamada system debe devolver true en el exito Si este no es el caso, la secuencia de comandos devuelve un código de error o no se puede ejecutar el comando.

+0

Hola tadman, gracias por su respuesta ... acabo de copiar su código y lo intenté pero no funcionó como esperaba ... ¿pueden decirme qué es File.expand_path? – palani

+0

Hola tadman, tu script busca el archivo Rails_Root/ar_sendmailer. pero este no es un archivo y este es el comando que se invoca desde la carpeta raíz de la aplicación Rails. como [/ home/username/railsapp] $ ar_sendmail -o -t NewLetter -V. así que rastrear archivo voy a la carpeta raíz de la aplicación Rails y desencadenar el comando anterior de que lo que necesito ... por favor, ayúdenme en este – palani

+0

'File.expand_path' se utiliza para ... expandir rutas, básicamente. Unirá adecuadamente dos caminos, como agregar 'ar_sendmail' en su ruta de Rails, sea lo que sea. También es bueno para eliminar cosas como '../../' cuando sea necesario, proporcionándole el camino correcto y completo. – tadman

26

El rastrillo sh incorporada es probablemente el mejor método:

task(:sh) do 
    sh('echo', 'a') 
    sh('false') 
    sh('echo', 'b') 
end 

La interfaz es similar a Kernel.system pero:

  • aborta si la devolución es = 0, lo que lo anterior no alcanza nunca echo b
  • el propio comando se hizo eco antes de la salida
  • !
+1

Parece el mejor método para mí también –

Cuestiones relacionadas