20

我的 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

上述运行命令抛出未定义的运行方法和系统命令未抛出任何错误但未执行。

4

3 回答 3

29

耙子sh 内置任务

这可能是最好的方法:

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

界面类似于Kernel.system但是:

  • 如果返回为 != 0,它将中止,因此上述内容永远不会达到echo b
  • 命令本身在输出之前回显
于 2014-10-18T19:05:24.480 回答
7

runCapistrano 和其他东西使用它来启动命令,但 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成功。如果不是这种情况,要么脚本返回错误代码,要么命令无法运行。

于 2010-09-08T14:31:04.247 回答
6

此链接可以帮助您将命令行命令运行到 ruby​​ ...

http://zhangxh.net/programming/ruby/6-ways-to-run-shell-commands-in-ruby/

从 Ruby 调用 shell 命令

http://blog.jayfields.com/2006/06/ruby-kernel-system-exec-and-x.html

%x[command].each do |f|
  value = f
end
于 2010-09-08T16:18:19.207 回答