المشكلة · فصل ٢

npm وYarn وpnpm مش تلات واجهات

package-lock · yarn.lock · pnpm-lock · node_modules
🎯 الهدف: تعرف المشاكل اللي تحصل لما أفراد الفريق يستخدموا مديري حزم مختلفين على نفس المشروع.

كل مدير له عقد وطريقة بناء

لو مشروع معمول بـ npm وصاحبك شغّل Yarn أو pnpm، هو مش بس غيّر اسم الأمر. كل مدير عنده lockfile وطريقة تثبيت:

npm

يكتب package-lock.json ويبني node_modules بالطريقة اللي npm متوقعها.

Yarn

يكتب yarn.lock. بعض إصداراته تقدر تستخدم Plug’n’Play بدل node_modules.

pnpm

يكتب pnpm-lock.yaml، ويستخدم content-addressable store وروابط بدل نسخ كل حزمة لكل مشروع.

إيه المشكلة العملية؟

تخيل المستودع فيه package-lock.json. صاحبك تجاهله وشغّل pnpm install:

  1. pnpm يحل الحزم بقواعده.
  2. يكتب pnpm-lock.yaml.
  3. يبني layout مختلف.
  4. بقى عندك ملفا قفل، ومفيش إجابة واحدة لسؤال: “أنهي شجرة هي الرسمية؟”

ممكن التطبيق يشتغل عنده ويقع عندك بسبب peer dependency مختلفة، أو import كان متاح بالصدفة مع hoisting مدير ومش متاح مع مدير تاني. والـ CI ممكن يقرأ lockfile غير اللي المطور اختبره.

حتى نسختين من نفس المدير ممكن يختلفوا

npm ٨ وnpm ١١ مش شرط يكتبوا نفس صيغة القفل أو يحلوا الـ peers بنفس السلوك. نفس الكلام بين major versions من pnpm. عشان كده الاتفاق محتاج:

اختيار المدير جزء من إعداد المشروع، مش تفضيل شخصي لكل مطور.

طب ما نخلي README يقول؟

اكتبها في README، لكن النص مش enforcement. حد ممكن ينسى ويكتب npm install. حقل packageManager يخلي الاتفاق machine-readable، وCorepack يقرأه قبل تشغيل المدير.

خلّصت الفصل لما

🧠 اختبر نفسك
١) وجود package-lock وpnpm-lock مع بعض معناه إيه؟
غالبًا مديرين اتستخدموا، ومحتاج تحدد مين الرسمي وتحذف القفل التاني.
٢) هل اختلاف manager يغيّر الأوامر بس؟
لأ. ممكن يغيّر حل الحزم والـ lockfile وشكل node_modules.
٣) README لوحده يمنع npm install؟
لأ. تعليمات للبشر، مش بوابة تنفيذ.