مهمة rake للـPlugin تعمل عدة مرات - ماذا نغفل عنه؟

أنا أضيف مهمة 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 بهذه النتيجة:

/var/www/discourse# mv plugins/docker_manager/lib/tasks/testing.rake plugins/poll/lib/tasks/
/var/www/discourse# rake docker_manager:test --trace
** Invoke docker_manager:test (first_time)
** Execute docker_manager:test
test

لم أتمكن بعد من العثور على أي شيء واضح في المكونين الإضافيين الذي قد يمنع/يسبب هذا، لذا آمل أن يتمكن شخص ما من تقديم اقتراحات لما قد يمنع هذا في poll أو يسببه في docker_manager.

3 إعجابات

هل قمت بحل هذه المشكلة؟

أواجه مشكلة مماثلة:

إذا قمت بإنشاء مهمة rake في إضافة، على سبيل المثال: lib/tasks/test.rake

بمحتويات

desc "count posts"
task "test_rake:test" => :environment do
  puts "Number of posts on this forum is #{Post.count}"
end

وقمت بتشغيل: rake test_rake:test

فإن الناتج يفاجئني:

Number of posts on this forum is 366
Number of posts on this forum is 366
Number of posts on this forum is 366

أنا أرتكب خطأ ما بالتأكيد، لكن لست متأكدًا ما هو؟

لماذا يتم تشغيل هذا أكثر من مرة وكيف يمكنني إيقافه؟

أواجه مشكلة مماثلة في بيئة الإنتاج، وهي بالطبع مصدر قلق أكبر.

إعجابَين (2)

حسنًا، تمكنت من تقليل المهمة إلى التشغيل مرتين فقط عن طريق إزالة المهمة من التحميل في كتلة التهيئة. يبدو أن مجرد وضعها في /lib/tasks يكفي دون الحاجة إلى تحميلها.

لقد أدى ذلك إلى تقليل التكرار إلى مرة واحدة (ليصبح المجموع 2!) :sweat_smile:

عدد المشاركات في هذا المنتدى هو 366
عدد المشاركات في هذا المنتدى هو 366

هذا يكرر تجربة OP.

إعجابَين (2)

للأسف لا. في البداية، افترضت أن شيئًا ما في النواة تسبب في تحميله مرتين، لكن رؤية أنه تم تحميله مرة واحدة فقط عند إضافته إلى إضافة الاستطلاع بدا وكأنه يدحض ذلك.

لقد نسيت الأمر تقريبًا الآن، لكن أعتقد أن استخدام --trace قد يُظهر أيضًا أنه يتم تحميله مرة واحدة فقط. قد أكون مخطئًا، ولكن إذا كنت أتذكر بشكل صحيح، فإن أسطر الاستدعاء و/أو التنفيذ ستظهر مرتين إذا تم تحميله مرتين.

فشلت في العثور على أي اختلافات بين docker_manager و poll أو أي شيء في النواة من شأنه أن يفسر هذا الاختلاف في السلوك، وقد استسلمت تقريبًا عندما قمت بنشر الموضوع.

إعجاب واحد (1)

قد أتأخر قليلاً عن الحفل :slight_smile:

أواجه نفس المشكلة في إضافة جديدة، وقمت بالبحث قليلاً. يبدو أن هذه المشكلة تؤثر على إضافات أخرى أيضاً (مثل: إضافة الدردشة الرسمية)، ولكني وجدت حلاً فعالاً لتجنب تسجيل المهام عدة مرات:

# مسح أي تسجيل سابق
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، لذا يجب مسحها قبل ذلك.

3 إعجابات

هل هذا يعني أنك تحصل على نفس النتيجة عند إضافة مهمة إليها أو أن مهمة موجودة بالفعل في الإضافة لها هذا السلوك؟

شكرًا على المعلومات! يبدو الأمر وكأنه حل مؤقت أن تضطر إلى مسحها، ولكنه بالتأكيد حل عملي مفيد.

سأضع علامة على مشاركتك كحل لراحة الآخرين. نأمل أن يتم تحديد السبب الأوسع نطاقًا، وأعتقد أن السؤال يصبح: لماذا يتم تسجيل المهام مرتين في بعض الإضافات وليس في غيرها؟

\u003e هل هذا يعني أنك تحصل على نفس النتيجة عند إضافة مهمة إليها أم أن مهمة موجودة بالفعل في المكون الإضافي لها هذا السلوك؟

أثناء محاولة فهم سبب تنفيذ المهام التي طورتها في المكون الإضافي الخاص بي مرتين، اختبرت مهمة موجودة في المكون الإضافي للدردشة وتم تنفيذها مرتين أيضًا.

اختبرت بعض المهام من مكونات إضافية أخرى أيضًا ولكن لا يمكنني تذكر أي منها. تم تنفيذ بعضها مرة واحدة ولكن لم يكن هناك شيء واضح بشأن الاختلاف في التنفيذ.

ربما هناك شيء يتعلق بالتحميل التلقائي؟

في مكون إضافي جديد، يحتوي المحرك على هذا السطر:

config.autoload_paths << File.join(config.root, "lib")

إذا لم أقم بتحميل lib تلقائيًا ولكن lib/some_path لتجنب التحميل التلقائي لـ lib/tasks، يبدو الأمر أفضل، ولكن العيب هو أنه يكسر التحميل التلقائي (توقفت هنا). مما قد يؤدي إلى وجود مجموعة من عبارات require_relative للتعويض…

إعجابَين (2)

يبدو بالتأكيد معقولاً أنه إذا كانت هناك آلية بالفعل لتحميل المهام، فقد يؤدي ذلك إلى تحميلها مرة أخرى.

أتساءل عما إذا كان استخدام أي مما يلي سيتعامل مع هذا (أعتقد أنني سأميل إلى الأخير لأنني لا أعرف ما هي الآثار الجانبية التي يمكن أن تكون للتحميل التلقائي مرة واحدة):

config.autoload_once_paths << File.join(config.root, "lib")
config.autoload_lib(ignore: %w( tasks ))

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.