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

发布于 2024-09-18 18:37:44 字数 367 浏览 9 评论 0 原文

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

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

I have the rake tasks in my rails application. i want to run a commandline commands with in rake task. how can i do this. i tried by the following but fails

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

The above run command throws run method undefined & System command not throwing any errors but not executed.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

萌吟 2024-09-25 18:37:44

Rake sh 内置任务

这可能是最好的方法:

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

该接口类似于 Kernel.system 但是:

  • 如果返回 != 则中止0,所以上面的内容永远不会达到 echo b
  • 命令本身在输出之前回显

Rake sh built-in task

This is probably the best method:

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

The interface is similar to Kernel.system but:

  • it aborts if the return is != 0, so the above never reaches echo b
  • the command itself is echoed before the output
倾城花音 2024-09-25 18:37:44

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

run is used by Capistrano and other things for launching commands, but Rake often makes use of Kernel#system instead.

Your command might be being run, but not working. Why not make a wrapper shell script you can test independently, or try and kick off using the full path:

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

It would seem odd to have your script not in scripts/

The system call should return true on success. If this is not the case, either the script returned an error code, or the command could't be run.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文