2010-09-08 86 views
13

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

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

回答

5
+0

Rake有一个运行shell命令的特定方法''# sh'。它具有使用'/ bin/sh'的缺点,但不是bash。要使用rake的'sh'方法使用bash,请参阅https:// stackoverflow中的重复问题的答案。com/questions/9796028/execute-bash-commands-from-rakefile/34523379#34523379 – 2015-12-30 05:35:15

5

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

+0

嗨tadman,感谢您的回答...我刚刚复制了您的代码,并尝试但没有按预期工作..你可以告诉我什么是File.expand_path吗? – palani 2010-09-08 14:38:27

+0

Hello tadman,您的脚本正在寻找文件Rails_Root/ar_sendmailer。但这不是一个文件,而且这是从Rails应用程序根文件夹调用的命令。像[/ home/username/railsapp] $ ar_sendmail -o -t NewLetter -V。所以我耙文件我去Rails应用程序的根文件夹,并触发上述命令,我需要...请帮助我在这 – palani 2010-09-08 15:00:02

+0

'File.expand_path'用于......基本上扩展路径。它将正确地将两条路径连接在一起,例如在您的Rails路径上追加'ar_sendmail',无论如何。在需要的时候消除诸如'../../'之类的东西也是很好的,给你适当的完整路径。 – tadman 2010-09-08 16:54:20

26

sh耙内置可能最好的方法:

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

该接口类似于Kernel.system但:

  • 它中止如果返回的是= 0,因此上述从未达到echo b
  • 命令本身被输出之前回荡
+1

似乎对我来说也是最好的方法 – 2015-01-31 13:21:31