
Andrew Hanna

Andrew Hanna

تعارضات الميتاداتا في Salesforce بتحصل لأن إعدادات الـ org بتاعتك موجودة في آلاف ملفات XML، وفي تلات حاجات في الملفات دي بتخلي الاصطدامات روتين: الـ Metadata API بترجّع العناصر بترتيب غير حتمي، والملفات المونوليثية زي البروفايلات بتجمّع تعديلات من شغل مالوش علاقة، والفرق بتعمل merge من sandboxes اتحرفت عن بعضها. معظم التعارضات اللي بتحاربها وهمية، ضوضاء مش خلاف حقيقي. بتوقفها بـ source tracking، وbranches قصيرة العمر، وpermission sets بدل البروفايلات، وmerge واعي بالميتاداتا بدل git diff خام.
تعارض الميتاداتا هو merge conflict في ملفات XML اللي بتعرّف الـ org: الأوبجكتس، والحقول، وApex، وflows، والبروفايلات، وpermission sets، والـ layouts. بيحصل لما branchين يغيّروا نفس الملف وgit ميقدرش يوفّق بينهم أوتوماتيك. وبما إن Salesforce بتمثّل الإعدادات كنص، كل كليك من أدمن وكل commit من مطوّر بيتحول في النهاية لسطر في ملف git لازم يعمله merge.
المشكلة إن كتير من التعارضات دي وهمية. git بيعلّم على اصطدام مفيش فيه خلاف دلالي حقيقي، بس XML متعاد ترتيبه أو إعادة تنسيقه.
أربع أسباب جذرية، تقريبًا حسب كتر ما بتضرب:
بعض أنواع الملفات أكتر عرضة للتعارض من غيرها بكتير:
لما التعارض يحصل فعلاً:
الـ three-way git merge الخام ميقدرش يفرّق XML متعاد ترتيبه عن تغيير حقيقي، وعشان كده منظومة Salesforce DevOps كلها اتفقت على الـ merge الواعي بالميتاداتا. وللخطوات بالتفصيل، بما فيها قراءة diff البروفايل والتعامل مع Flow متعارض، بُص على إزاي تحل تعارضات ميتاداتا Salesforce من غير ما تضيّع شغل حد.
كذا منصة بتقدّم merge دلالي أو واعي بالميتاداتا بيحل التعارضات الوهمية أوتوماتيك ويعلّم بس على الحقيقية. Gearset وCopado وAutoRABIT وFlosum وSalto وBlue Canvas كلهم بيشتغلوا في المجال ده، كل واحد بتوازن مختلف بين الأتمتة والتحكم. Serpent بياخد نهج git-native: بيقرا ميتاداتا بتاعتك بشكل سياقي، وبيلغي ضوضاء XML غير الوظيفية، وبيظهر بس التعارضات الحقيقية عشان إنسان يقرر، فالـ branches قصيرة العمر تفضل رخيصة في الـ merge.
هل معظم تعارضات ميتاداتا Salesforce حقيقية؟
لأ. كتير منها تعارضات وهمية بسبب ترتيب XML غير الحتمي أو إعادة التنسيق، والـ merge الواعي بالميتاداتا بيتجاهلها أوتوماتيك.
ليه البروفايلات عرضة للتعارض كده؟
البروفايل ملف كبير بيحتوي صلاحيات كل أوبجكت وحقل، فالتعديلات اللي مالهاش علاقة بتنزل جنب بعضها وgit بيقراها كاصطدام.
هل permission sets بتمنع التعارضات؟
بتقللها. permission sets الأصغر والمخصصة معناها ناس أقل بتعدّل نفس الملف، وده بيصغّر التداخل.
إزاي الـ branches قصيرة العمر بتساعد؟
الـ merge اليومي للـ trunk بيخلي الاختلاف صغير، فكل merge بيوفّق ساعات من التغيير بدل أسابيع.
هل CI/CD ممكن تلغي تعارضات الميتاداتا؟
مش تمامًا، بس source tracking والـ merges المتكررة والأدوات الواعية بالميتاداتا بتحوّل معظم التعارضات لحلول أوتوماتيك.
بدون التزام.