كل مدير له عقد وطريقة بناء
لو مشروع معمول بـ npm وصاحبك شغّل Yarn أو pnpm، هو مش بس غيّر اسم الأمر. كل مدير عنده lockfile وطريقة تثبيت:
يكتب package-lock.json ويبني node_modules بالطريقة اللي npm متوقعها.
يكتب yarn.lock. بعض إصداراته تقدر تستخدم Plug’n’Play بدل node_modules.
يكتب pnpm-lock.yaml، ويستخدم content-addressable store وروابط بدل نسخ كل حزمة لكل مشروع.
إيه المشكلة العملية؟
تخيل المستودع فيه package-lock.json. صاحبك تجاهله وشغّل pnpm install:
- pnpm يحل الحزم بقواعده.
- يكتب
pnpm-lock.yaml. - يبني layout مختلف.
- بقى عندك ملفا قفل، ومفيش إجابة واحدة لسؤال: “أنهي شجرة هي الرسمية؟”
ممكن التطبيق يشتغل عنده ويقع عندك بسبب peer dependency مختلفة، أو import كان متاح بالصدفة مع hoisting مدير ومش متاح مع مدير تاني. والـ CI ممكن يقرأ lockfile غير اللي المطور اختبره.
حتى نسختين من نفس المدير ممكن يختلفوا
npm ٨ وnpm ١١ مش شرط يكتبوا نفس صيغة القفل أو يحلوا الـ peers بنفس السلوك. نفس الكلام بين major versions من pnpm. عشان كده الاتفاق محتاج:
طب ما نخلي README يقول؟
اكتبها في README، لكن النص مش enforcement. حد ممكن ينسى ويكتب npm install. حقل packageManager يخلي الاتفاق machine-readable، وCorepack يقرأه قبل تشغيل المدير.