Как выполнять команды в рамках задач Rake? - PullRequest
18 голосов
/ 08 сентября 2010

У меня есть задачи с граблями в моем приложении rails. я хочу запускать команды командной строки в граблях. как я могу это сделать. я попробовал следующее, но не удалось

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 & Системная команда не выдает никаких ошибок, но не выполняется.

Ответы [ 3 ]

27 голосов

sh Встроенный рейк , вероятно, лучший метод:

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

Интерфейс похож на Kernel.system, но:

  • прерывается, если возвращаемое значение равно! = 0, поэтому вышеупомянутое никогда не достигает echo b
  • сама команда выводится перед выводом
7 голосов
/ 08 сентября 2010

run используется Capistrano и другими устройствами для запуска команд, но вместо этого Rake часто использует Kernel#system.

Возможно, ваша команда выполняется, но не работает. Почему бы не создать скрипт оболочки-обертки, который вы можете протестировать самостоятельно, или попробовать запустить его по полному пути:

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

Было бы странно, если бы ваш скрипт не был в scripts/

Вызов system должен вернуть true в случае успеха. Если это не так, либо скрипт вернул код ошибки, либо команда не может быть выполнена.

6 голосов
/ 08 сентября 2010

Эти ссылки могут помочь вам запустить команду командной строки в 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
...