【问题标题】:How to execute commands within Rake tasks?如何在 Rake 任务中执行命令?
【发布时间】:2010-09-08 14:13: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

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

【问题讨论】:

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


    【解决方案1】:

    Rake sh 内置任务

    这可能是最好的方法:

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

    界面类似于Kernel.system但是:

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

    【讨论】:

    • 对我来说似乎也是最好的方法
    【解决方案2】:

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

    【讨论】:

    • 嗨,tadman,感谢您的回答...我刚刚复制了您的代码并尝试了但没有按预期工作..您能告诉我 File.expand_path 是做什么的吗?
    • 你好 tadman,你的脚本正在寻找文件 Rails_Root/ar_sendmailer.但这不是一个文件,这是从 Rails 应用程序根文件夹调用的命令。像 [/home/username/railsapp]$ar_sendmail -o -t NewLetter -V 。所以我 rake 文件我转到 Rails 应用程序根文件夹并触发上面的命令,我需要什么......请帮助我
    • File.expand_path 用于...扩展路径,基本上。它将正确地将两条路径连接在一起,例如在 Rails 路径上附加 ar_sendmail,无论是什么。它还有助于在需要时消除 ../../ 之类的内容,从而为您提供正确的完整路径。
    • 您需要知道ar_sendmail 在哪里,否则您将无法正常启动它。您的 shell 有一个 PATH,它可能与 Ruby 将使用的不同,即使脚本不在您所在的目录中,它也可以使脚本正常工作。
    【解决方案3】:

    【讨论】:

    • Rake 有一个运行 shell 命令的特定方法,#sh。它的缺点是使用 /bin/sh,而不是 bash。要使用 Rake 的 sh 方法中的 bash,请参阅此对重复问题的答案:stackoverflow.com/questions/9796028/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    相关资源
    最近更新 更多