ruby on rails - rails - ¿Cómo ejecutar comandos dentro de las tareas de Rake?
ruby on rails scaffold (3)
Capistrano usa la run
y otras cosas para lanzar comandos, pero Rake a menudo utiliza Kernel#system
lugar.
Su comando puede estar siendo ejecutado, pero no funciona. ¿Por qué no hacer un script de shell envoltorio que pueda probar de forma independiente, o intentar y comenzar 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
Parece extraño que su script no esté en scripts/
La llamada al system
debería volver true
en true
de éxito. Si este no es el caso, el script devolvió un código de error o el comando no pudo ejecutarse.
Tengo las tareas de rake en mi aplicación de rieles. Quiero ejecutar un comando de línea de comandos con la tarea de rake. Cómo puedo hacer esto. Lo intenté por lo 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
El comando de ejecución anterior lanza el método de ejecución indefinido y el comando del sistema no genera ningún error, pero no se ejecuta.
Estos enlaces pueden ayudarte a ejecutar el comando de la línea de comandos en ruby ...
http://zhangxh.net/programming/ruby/6-ways-to-run-shell-commands-in-ruby/
Llamando comandos de shell desde Ruby
http://blog.jayfields.com/2006/06/ruby-kernel-system-exec-and-x.html
%x[command].each do |f|
value = f
end
El sh
Rake incorporado 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:
- se cancela si la devolución es! = 0, por lo que lo anterior nunca alcanza
echo b
- el comando en sí se hace eco antes de la salida