كيفية إصلاح CIRCULAR_DEPENDENCY في عمليات نشر Salesforce

يشير مكوّنان أو أكثر من الميتاداتا إلى بعضهما البعض، فلا تستطيع Salesforce تحديد ترتيب نشر صالح.

يظهر أثناء: التحقق من صحة نشر الميتاداتا، قبل تنفيذ أي اختبار

المعنى

يحدث CIRCULAR_DEPENDENCY عندما يتطلب كل من مكونين، غالبًا فئات Apex أو سجلات ميتاداتا مخصصة أو أنواع سجلات، وجود الآخر أولًا. تنشر Metadata API المكونات وفق ترتيب الاعتماد، والحلقة تعني عدم وجود ترتيب صالح يحقق الشرطين معًا.

يُعد Apex السبب الأكثر شيوعًا لأن المُصرّف يحل مراجع الفئات وقت النشر: إذا كان توقيع الفئة A يشير إلى الفئة B وتوقيع الفئة B يشير إلى الفئة A، فلا يمكن لأي منهما أن يُصرَّف بمفرده أولًا، بل معًا فقط ضمن نفس معاملة النشر.

التشخيص

الأسباب الشائعة

فئتا Apex تشيران إلى دوال بعضهما البعض
تستدعي الفئة A دالة في الفئة B، وتستدعي الفئة B دالة في الفئة A، لذا لا يمكن لأي منهما أن تُصرَّف قبل وجود الأخرى.
أنواع الميتاداتا المخصصة تشير إلى بعضها البعض
يخزّن سجل ميتاداتا مخصص من النوع A مرجعًا إلى سجل من النوع B، ويشير سجل من النوع B مرة أخرى إلى النوع A.
أنواع السجلات تشير إلى قيم القوائم المنسدلة الخاصة ببعضها البعض
يقيّد كل نوع من نوعي سجلات على كائنات مترابطة قائمة منسدلة بقيم يتحكم بها نوع السجل الآخر، ما يخلق حلقة لا يستطيع النشر حلّها.

الحل

  1. انشر نسخة مبدئية (stub) أولًا لكسر الحلقة
    انشر جانبًا واحدًا من الزوج بتطبيق بسيط أو فارغ، ثم انشر المنطق الفعلي في خطوة ثانية.
  2. ادمج المكونين في عملية نشر واحدة
    اجمع الفئات أو الميتاداتا المترابطة في عملية نشر واحدة بحيث تحل Salesforce المجموعة بأكملها معًا بدلًا من ترتيبها فرديًا.
    sf project deploy start --source-dir force-app/main/default/classes/ClassA.cls force-app/main/default/classes/ClassB.cls
  3. أعد الهيكلة لإزالة الإشارة المتبادلة
    استخرج المنطق المشترك إلى فئة أو واجهة ثالثة بحيث لا يعتمد أي من المكونين الأصليين مباشرة على الآخر.
من واقع الاستخدام

إزاي Serpent بتمنع ده

يتتبّع Serpent المكونات التي تمسّها المهمة ويشير إلى المكونات المترابطة قبل تقسيمها بين مهام منفصلة، بحيث يُنشر الزوج الدائري معًا بدلًا من الفشل في منتصف الطريق. اطّلع على مكتبة أخطاء نشر Salesforce.

أداة بناء pipelines لـ CI/CD بلا كود في Serpent

الوقاية

صمّم المنطق المشترك ضمن أساس أو واجهة موحدة مسبقًا
عندما تحتاج فئتان إلى استدعاء بعضهما البعض، استخرج العقد المشترك إلى واجهة أو فئة أدوات مساعدة منذ البداية بدلًا من ربط مراجع مباشرة.
لا تقسّم أبدًا زوجًا مترابطًا بين مهام منفصلة
أبقِ المكونات التي تشير إلى بعضها البعض في نفس الفرع ونفس وحدة النشر، بحيث لا تُرقّى أبدًا بشكل مستقل.
خطّط للمراجع المتبادلة قبل تصميم علاقات الميتاداتا المخصصة
ارسم اتجاه المرجع بين أنواع الميتاداتا المخصصة قبل بنائها، بحيث تُكتشف أي تبعية ثنائية الاتجاه على الورق وليس وقت النشر.
أسئلة شائعة

CIRCULAR_DEPENDENCY: الإجابة

هل يؤدي تقسيم عملية النشر إلى مجموعات تغييرات أصغر إلى حل CIRCULAR_DEPENDENCY؟
لا، عادةً ما يزيد الأمر سوءًا. تقسيم المكونات المترابطة عبر عمليات نشر منفصلة هو ما يسبب الحلقة أصلًا؛ والحل هو تجميعها في عملية نشر واحدة.
هل يمكن لثلاثة مكونات أو أكثر أن تشكّل تبعية دائرية، وليس اثنين فقط؟
نعم. أي حلقة بأي طول، A تعتمد على B، وB تعتمد على C، وC تعتمد مجددًا على A، تسبب نفس الخطأ؛ والحل يبقى نشر الحلقة كاملة معًا.
هل تحل Salesforce CLI التبعيات الدائرية في Apex تلقائيًا؟
لا. تنشر الـ CLI مجموعة الملفات التي توجّهها إليها كمعاملة واحدة؛ فهي لا تعيد ترتيب المكونات أو تنشئ نسخًا مبدئية عنك، لذا يجب تضمين جانبي الزوج صراحةً.

ابدأ مجانًا. بدون بطاقة ائتمان، وبدون تثبيت، وبدون التزام.

يتم الإعداد في أقل من 15 دقيقة. بدون الحاجة لتوظيف DevOps.

هل تريد معرفة كيف يمكنكم الشحن أسرع قبل البدء؟ لنتحدث

بدون التزام.