Cómo ejecutar comandos dentro de las tareas de Rake?
-
01-10-2019 - |
Pregunta
Tengo las tareas rake en mi solicitud rieles. Quiero ejecutar un comando de línea de comandos con el rastrillo en la tarea. Cómo puedo hacer esto. He intentado por el siguiente pero falla
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
Método El orden de marcha por encima de tiros ejecutar indefinido y comandos del sistema no lanzar ningún error pero no se ejecuta.
Solución
Estos links puede ayudarle a ejecutar comandos en la línea de comandos de rubí ...
http: // zhangxh. net / programación / ruby ??/ 6-ways-to-run-shell-comandos-en-rubí /
Calling comandos shell desde Ruby
http: //blog.jayfields .com / 2006/06 / rubí-kernel-sistema-exec-y-x.html
%x[command].each do |f|
value = f
end
Otros consejos
La sh
rastrillo 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 repite antes de la salida
run
es utilizado por Capistrano y otras cosas para el lanzamiento de comandos, pero Rake menudo hace uso de Kernel#system
lugar.
Su comando podría estar siendo ejecutado, 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
Al parecer extraño tener la secuencia de comandos no en scripts/
La llamada system
debe devolver true
en caso de éxito. Si este no es el caso, o bien la secuencia de comandos devuelve un código de error, o el comando could't ser ejecutado.