2010-09-08 85 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