كيفية تنفيذ الأوامر داخل مهام أشعل النار؟
-
01-10-2019 - |
سؤال
لدي مهام أشعل النار في تطبيق 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 Run Trows Method غير محددة وعدم إلقاء أي أخطاء ولكن لم يتم تنفيذها.
المحلول
قد تساعدك هذه الروابط في تشغيل أمر سطر الأوامر في 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
أشعل النار مدمج ربما تكون أفضل طريقة:
task(:sh) do
sh('echo', 'a')
sh('false')
sh('echo', 'b')
end
الواجهة مشابهة ل Kernel.system
لكن:
- يتم إحباط إذا كانت العودة! = 0 ، لذلك لا تصل أعلاه أبدًا
echo b
- يردد الأمر نفسه قبل الإخراج
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
على النجاح. إذا لم تكن هذه هي الحالة ، فلا يتم تشغيل البرنامج النصي إلى رمز خطأ ، أو أنه لا يمكن تشغيل الأمر.