質問

Railsアプリケーションにレイクタスクがあります。 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メソッドをスローし、エラーをスローしませんが実行されません。

役に立ちましたか?

解決

このリンクは、コマンドラインコマンドを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

他のヒント

sh レーキが組み込まれています おそらく最良の方法です:

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

インターフェイスはに似ています Kernel.system しかし:

  • リターンが!= 0の場合、それは中止するので、上記は決して到達しません 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 成功について。これが当てはまらない場合、スクリプトがエラーコードを返したか、コマンドを実行できませんでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top