للعثور على الدليل الذي يستخدمه برنامج npm نصي على جهاز Mac الخاص بك، تحقق من الحزمة التي تمتلك هذا البرنامج النصي، ثم قم بطباعة الدليل من داخل ذلك البرنامج النصي. يقوم npm بتشغيل البرنامج النصي من مجلد الحزمة الخاصة به، حتى لو بدأت تشغيل npm run من مكان آخر. في مشروع مساحات العمل (workspaces)، قد تكون حزمة مساحة العمل المحددة هي المجلد المعني. تساعدك الخطوات أدناه في تحديد المسار بدقة وتمييزه عن المجلد الذي كتبت فيه الأمر.

1. ابحث عن الحزمة والبرنامج النصي الذي تقوم بتشغيله

افتح تطبيق Terminal وانتقل إلى مجلد المشروع حيث تقوم عادةً بتشغيل npm. يستخدم macOS صدفة zsh افتراضيًا في Terminal، على الرغم من إمكانية تغيير الصدفة الخاصة بك. استخدم الأمر pwd لعرض دليلك الحالي، ثم ادرج الملفات لمعرفة ما إذا كان هذا المجلد يحتوي على ملف package.json. يوضح دليل Terminal من Apple كيفية إدخال الأوامر في Terminal واستخدام أدوات مثل ls.

pwd
ls

إذا لم تكن متأكدًا من الحزمة التي تحدد البرنامج النصي، فافحص ملف package.json في المجلد الحالي. يمكنك عرضه باستخدام cat package.json، أو فتحه في محرر نصوص. ابحث عن اسم البرنامج النصي ضمن كائن scripts. على سبيل المثال، في "scripts": { "build": "node build.js" }، يكون اسم البرنامج النصي المراد تشغيله هو build. لا تفترض أن مجلد المشروع من المستوى الأعلى هو مالك البرنامج النصي إذا كان هذا مستودع مساحات عمل (workspace repository).

2. تحقق من الدليل المتوقع لـ npm

بالنسبة لإصدارات npm الحالية، يتم تشغيل البرامج النصية من جذر مجلد الحزمة، بغض النظر عن الدليل الذي نفذت منه الأمر npm run. في المشروع القياسي، يكون هذا هو المجلد الذي يحتوي على ملف package.json الخاص بالحزمة. أما في مشروع مساحات العمل، يمكن لـ npm تشغيل البرنامج النصي في سياق مساحة عمل محددة؛ وحزمة مساحة العمل هذه هي التي ينبغي التحقق منها. راجع وثائق npm حول أدلة عمل البرامج النصية وتشغيل البرامج النصية في مساحات العمل.

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

3. طباعة الدليل من داخل البرنامج النصي

أوضح فحص هو إضافة pwd مؤقتًا في بداية أمر البرنامج النصي في package.json. على سبيل المثال، قم بتغيير:

"build": "node build.js"

إلى:

"build": "pwd && node build.js"

ثم قم بتشغيل البرنامج النصي كالمعتاد:

npm run build

المسار المطبوع قبل أمر البناء هو دليل العمل الحالي للصدفة في تلك النقطة. يستخدم هذا الفحص التشخيصي المعامل &&، وبالتالي لن يتم تشغيل node build.js إلا إذا نجح الأمر pwd. بعد التحقق، قم بإزالة البادئة التشخيصية واستعادة الأمر الأصلي. راجع الملف قبل الحفظ إذا كان البرنامج النصي الأصلي يستخدم بالفعل معاملات الصدفة، أو علامات الاقتباس، أو أمر تغليف؛ واحتفظ بالترتيب وبناء الجملة المقصودين.

إذا كان البرنامج النصي عبارة عن ملف Node.js وكان بإمكانك تعديله، فهناك فحص مباشر آخر يتمثل في إضافة console.log(process.cwd()) مؤقتًا بالقرب من بدايته. توثق Node الدالة process.cwd() على أنها دليل العمل الحالي لعملية Node.js. يشير ذلك إلى الدليل الذي تراه Node عند تنفيذ هذا السطر؛ وإذا قام البرنامج لاحقًا بتغيير دليل العمل الخاص به، فقد تتغير هذه القيمة.

4. قراءة النتيجة ومراعاة مساحات العمل

قارن المسار المطبوع بالمسار الذي أظهره الأمر pwd قبل تشغيل npm. قد يختلفان: دليل البرنامج النصي لـ npm هو جذر الحزمة، بينما دليل Terminal هو المكان الذي قمت بتشغيل الأمر منه. على سبيل المثال، إذا بدأ Terminal الخاص بك في جذر المستودع ولكنك قمت بتشغيل برنامج نصي محدد بواسطة حزمة ضمن packages/site، فإن سياق حزمة البرنامج النصي يمكن أن يكون مساحة العمل تلك. توثق npm تحديد واحدة باستخدام --workspace؛ كما يمكنك أيضًا تشغيل برنامج نصي من داخل دليل مساحة العمل.

npm run build --workspace=site

استخدم اسم مساحة العمل أو المسار الذي يتطابق مع إعدادات workspaces الخاصة بالمشروع. إذا كانت النتيجة غير متوقعة، فتأكد من تحديد البرنامج النصي ومساحة العمل الصحيحين، ثم تحقق مما إذا كان البرنامج النصي نفسه يحتوي على cd أو يستدعي أداة أخرى تغير الأدلة. قد يكون للعملية الفرعية أيضًا إعداد دليل العمل الخاص بها؛ تحقق من إعدادات تلك الأداة إذا كان سلوكها يختلف عن البرنامج النصي الرئيسي.

ما يخبرك به INIT_CWD

توفر npm المتغير INIT_CWD للدليل الذي كنت موجودًا فيه عندما نفذت الأمر npm run. يمكن أن تكون هذه القيمة مفيدة عندما يحتاج البرنامج النصي إلى معرفة المكان الذي بدأ منه المستدعي، لكنها ليست دليل العمل الحالي للبرنامج النصي. استخدم pwd داخل البرنامج النصي للصدفة أو process.cwd() داخل Node.js لمعاينة الدليل الذي تراه العملية الجاري تشغيلها. هذا التمييز مفيد بشكل خاص عندما يعمل مسار الملف النسبي من موقع تشغيل ما ويفشل من موقع آخر.

لإجراء تشخيص سريع، ابدأ بقاعدة npm الخاصة بجذر الحزمة، وحدد مساحة العمل المطلوبة إذا لزم الأمر، واطبع pwd داخل البرنامج النصي لتأكيد المسار الفعلي عند النقطة التي يتم تشغيله فيها.

المصادر