20

Railsアプリケーションにレーキタスクがあります。inrakeタスクでコマンドラインコマンドを実行したい。これどうやってするの。私は次のことを試しましたが失敗します

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コマンドはrunmethodundefinedをスローし、Systemコマンドはエラーをスローしませんが実行されません。

4

3 に答える 3

29

レーキsh 組み込みタスク

これはおそらく最良の方法です:

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

インターフェイスは似てKernel.systemいますが、次のとおりです。

  • 戻り値が!= 0の場合は中止されるため、上記が到達することはありませんecho b
  • コマンド自体が出力の前にエコーされます
于 2014-10-18T19:05:24.480 に答える
7

runCapistranoやその他のコマンドを起動するために使用されますが、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成功すると戻ります。そうでない場合は、スクリプトがエラーコードを返したか、コマンドを実行できませんでした。

于 2010-09-08T14:31:04.247 に答える
6

このリンクは、コマンドラインコマンドをrubyに実行するのに役立つ場合があります...

http://zhangxh.net/programming/ruby/6-ways-to-run-shell-commands-in-ruby/

Rubyからシェルコマンドを呼び出す

http://blog.jayfields.com/2006/06/ruby-kernel-system-exec-and-x.html

%x[command].each do |f|
  value = f
end
于 2010-09-08T16:18:19.207 に答える