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
上記のrunコマンドはrunmethod undefinedをスローし、Systemコマンドはエラーをスローしませんが実行されません。
このリンクは、コマンドラインコマンドをRuby.。
http://zhangxh.net/programming/Ruby/6-ways-to-run-Shell-commands-in-Ruby/
http://blog.jayfields.com/2006/06/Ruby-kernel-system-exec-and-x.html
%x[command].each do |f|
value = f
end
sh
Rakeビルトインがおそらく最良の方法です:
task(:sh) do
sh('echo', 'a')
sh('false')
sh('echo', 'b')
end
インターフェースはKernel.system
に似ていますが、次の点に注意してください。
echo b
に達することはありません。run
は、コマンドを起動するためにCapistranoやその他のものによって使用されますが、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
を返す必要があります。そうでない場合は、スクリプトがエラーコードを返すか、コマンドを実行できませんでした。