أنا أضيف مهمة rake إلى المكون الإضافي docker_manager ولكني أجد أن المهمة تعمل مرتين عند استدعائها. في أبسط صورها، يمكنني إضافة testing.rake إلى lib/tasks بالمحتويات التالية:
# frozen_string_literal: true
desc "A test"
task "docker_manager:test" do
puts "test"
end
مع هذه النتيجة:
/var/www/discourse# rake docker_manager:test --trace
** Invoke docker_manager:test (first_time)
** Execute docker_manager:test
test
test
لقد تأكدت من أن هذه ليست مشكلة عامة مع المهام في المكونات الإضافية عن طريق إضافة نفس ملف rake إلى المكون الإضافي poll بهذه النتيجة:
لم أتمكن بعد من العثور على أي شيء واضح في المكونين الإضافيين الذي قد يمنع/يسبب هذا، لذا آمل أن يتمكن شخص ما من تقديم اقتراحات لما قد يمنع هذا في poll أو يسببه في docker_manager.
حسنًا، تمكنت من تقليل المهمة إلى التشغيل مرتين فقط عن طريق إزالة المهمة من التحميل في كتلة التهيئة. يبدو أن مجرد وضعها في /lib/tasks يكفي دون الحاجة إلى تحميلها.
لقد أدى ذلك إلى تقليل التكرار إلى مرة واحدة (ليصبح المجموع 2!)
عدد المشاركات في هذا المنتدى هو 366
عدد المشاركات في هذا المنتدى هو 366
للأسف لا. في البداية، افترضت أن شيئًا ما في النواة تسبب في تحميله مرتين، لكن رؤية أنه تم تحميله مرة واحدة فقط عند إضافته إلى إضافة الاستطلاع بدا وكأنه يدحض ذلك.
لقد نسيت الأمر تقريبًا الآن، لكن أعتقد أن استخدام --trace قد يُظهر أيضًا أنه يتم تحميله مرة واحدة فقط. قد أكون مخطئًا، ولكن إذا كنت أتذكر بشكل صحيح، فإن أسطر الاستدعاء و/أو التنفيذ ستظهر مرتين إذا تم تحميله مرتين.
فشلت في العثور على أي اختلافات بين docker_manager و poll أو أي شيء في النواة من شأنه أن يفسر هذا الاختلاف في السلوك، وقد استسلمت تقريبًا عندما قمت بنشر الموضوع.
أواجه نفس المشكلة في إضافة جديدة، وقمت بالبحث قليلاً. يبدو أن هذه المشكلة تؤثر على إضافات أخرى أيضاً (مثل: إضافة الدردشة الرسمية)، ولكني وجدت حلاً فعالاً لتجنب تسجيل المهام عدة مرات:
# مسح أي تسجيل سابق
task('import_json:preview').clear
# تعريف المهمة
desc 'Previews changes which would be applied by import_json'
task 'import_json:preview', [:file_path] => :environment do |_task, args|
puts "Hello world!"
end
مسح المهمة بعد وصفها سيمنع ظهور المهمة في قائمة rake --tasks، لذا يجب مسحها قبل ذلك.
هل هذا يعني أنك تحصل على نفس النتيجة عند إضافة مهمة إليها أو أن مهمة موجودة بالفعل في الإضافة لها هذا السلوك؟
شكرًا على المعلومات! يبدو الأمر وكأنه حل مؤقت أن تضطر إلى مسحها، ولكنه بالتأكيد حل عملي مفيد.
سأضع علامة على مشاركتك كحل لراحة الآخرين. نأمل أن يتم تحديد السبب الأوسع نطاقًا، وأعتقد أن السؤال يصبح: لماذا يتم تسجيل المهام مرتين في بعض الإضافات وليس في غيرها؟
\u003e هل هذا يعني أنك تحصل على نفس النتيجة عند إضافة مهمة إليها أم أن مهمة موجودة بالفعل في المكون الإضافي لها هذا السلوك؟
أثناء محاولة فهم سبب تنفيذ المهام التي طورتها في المكون الإضافي الخاص بي مرتين، اختبرت مهمة موجودة في المكون الإضافي للدردشة وتم تنفيذها مرتين أيضًا.
اختبرت بعض المهام من مكونات إضافية أخرى أيضًا ولكن لا يمكنني تذكر أي منها. تم تنفيذ بعضها مرة واحدة ولكن لم يكن هناك شيء واضح بشأن الاختلاف في التنفيذ.
إذا لم أقم بتحميل lib تلقائيًا ولكن lib/some_path لتجنب التحميل التلقائي لـ lib/tasks، يبدو الأمر أفضل، ولكن العيب هو أنه يكسر التحميل التلقائي (توقفت هنا). مما قد يؤدي إلى وجود مجموعة من عبارات require_relative للتعويض…
يبدو بالتأكيد معقولاً أنه إذا كانت هناك آلية بالفعل لتحميل المهام، فقد يؤدي ذلك إلى تحميلها مرة أخرى.
أتساءل عما إذا كان استخدام أي مما يلي سيتعامل مع هذا (أعتقد أنني سأميل إلى الأخير لأنني لا أعرف ما هي الآثار الجانبية التي يمكن أن تكون للتحميل التلقائي مرة واحدة):