如何在Rake任务中执行命令?

时间:2010-09-08 14:13:20

标签: ruby-on-rails shell command-line rake rake-task

我在rails应用程序中有rake任务。我想在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

上面的运行命令抛出run方法undefined&系统命令不会抛出任何错误但不会执行。

3 个答案:

答案 0 :(得分:27)

sh Rake内置可能是最好的方法:

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

界面类似于Kernel.system但是:

  • 如果返回值为!= 0则中止,因此上述内容永远不会达到echo b
  • 命令本身在输出
  • 之前回显

答案 1 :(得分:7)

Capistrano和其他东西使用

run来启动命令,但Rake经常使用Kernel#system代替。

您的命令可能正在运行,但无法运行。为什么不创建一个可以独立测试的包装器shell脚本,或尝试使用完整路径启动:

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。如果不是这种情况,则脚本会返回错误代码,或者无法运行命令。

答案 2 :(得分:6)