التطبيق · فصل ٦

طب لو صاحبي معندوش Corepack؟

onboarding · clone · CI · frozen-lockfile · Node 25
🎯 الهدف: تعمل خطوات بداية واحدة لزميل جديد وللسيرفر، حتى لو Corepack مش موجود.

المشروع مينفعش يفترض الجهاز

وجود packageManager داخل Git مهم، لكنه مش بينزّل Corepack سحريًا. لو صاحبك معندوش Corepack، أو عنده pnpm عالمي يسبق الـ shim، ممكن الاتفاق ما يتطبقش.

الحل مش “كل واحد يظبط جهازه بطريقته”. اكتب onboarding قصير يتكرر في الجهاز والـ CI:

terminal
git clone https://example.com/koshary-app.gitcd koshary-appnode --versionnpm install -g corepack@0.36.0corepack enablecorepack installpnpm --versionpnpm install --frozen-lockfile

corepack install يجهّز النسخة المكتوبة قبل أمر pnpm، فيفصل خطأ تنزيل المدير عن خطأ تنزيل dependencies. هو مفيد، لكن مش إلزامي كل مرة.

نفس الاتفاق في GitHub Actions

الـ CI جهاز جديد؛ دي ميزة، لأنه يكشف الافتراضات اللي على لابتوبك.

.github/workflows/check.yml
steps:  - uses: actions/checkout@v4  - uses: actions/setup-node@v4    with:      node-version: 22  - run: npm install -g corepack@0.36.0  - run: corepack enable  - run: corepack install  - run: pnpm install --frozen-lockfile  - run: pnpm test

ليه مثبتناش pnpm@latest عالميًا؟ لأن نسخة pnpm جاية من المشروع. وليه ثبّتنا Corepack برقم؟ لأننا عايزين launcher نفسه ثابت في الفريق والـ CI.

Lab: اكسر كل طبقة

اعمل مشروع تجريبي:

terminal
mkdir corepack-lab && cd corepack-labnpm init -ynpm install -g corepack@0.36.0corepack enablecorepack use pnpm@10.15.0pnpm --versionyarn install

راجع إن package.json أخد packageManager ومعاه integrity hash، وإن yarn install وقع برسالة تقول إن المشروع بيستخدم pnpm.

بعدين جرّب:

terminal
corepack enable npmnpm install

المفروض npm يقع برضه. كده شفت الفرق بين حقل مكتوب، وshim موجود، وأمر فعلًا مرّ من خلاله.

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

🧠 اختبر نفسك
١) صاحبك معندوش Corepack. هل packageManager ينزّله؟
لأ. لازم provisioning صريح: تثبيت Corepack ثم enable.
٢) ليه corepack install قبل pnpm install؟
يجهّز مدير الحزم ويفشل بدري لو تنزيله فيه مشكلة. لكنه مش لازم قبل كل install.
٣) مين يحدد نسخة pnpm في CI؟
حقل packageManager داخل المشروع، مش npm install -g pnpm@latest.