Как выполнять команды в задачах Rake
У меня есть rake-задачи в моем приложении rails. Я хочу запустить команды командной строки с помощью команды 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
Вышеуказанная команда запуска запускает метод undefined, а системная команда не выдает никаких ошибок, но не выполняется.
Я хочу сделать это.. может кто-нибудь, пожалуйста, поправьте меня на это. как можно правильно определить команды командной строки
Ответы
Ответ 1
Эти ссылки могут помочь вам запустить команду командной строки в ruby ...
http://zhangxh.net/programming/ruby/6-ways-to-run-shell-commands-in-ruby/
Вызов команд оболочки из Ruby
http://blog.jayfields.com/2006/06/ruby-kernel-system-exec-and-x.html
%x[command].each do |f|
value = f
end
Ответ 2
sh
Rake встроенный, вероятно, лучший метод:
task(:sh) do
sh('echo', 'a')
sh('false')
sh('echo', 'b')
end
Интерфейс похож на Kernel.system
, но:
- он прерывается, если возврат равен!= 0, поэтому выше никогда не достигает
echo b
- сама команда будет эхом перед выходом
Ответ 3
run
используется Capistrano и другими функциями для запуска команд, но Rake часто использует Kernel#system
вместо этого.
Ваша команда может быть запущена, но не работает. Почему бы не сделать оболочку оболочки script, вы можете протестировать самостоятельно или попробовать и начать с полного пути:
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
Казалось бы странным иметь ваш script не в scripts/
Вызов system
должен возвращать true
при успешном завершении. Если это не так, либо script возвращает код ошибки, либо команда не может быть запущена.