আপনার ম্যাক-এ একটি npm স্ক্রিপ্ট কোন ডিরেক্টরি ব্যবহার করে তা খুঁজে বের করতে, প্রথমে স্ক্রিপ্টটি কোন প্যাকেজের অন্তর্গত তা পরীক্ষা করুন, তারপর সেই স্ক্রিপ্টের ভেতর থেকে ডিরেক্টরিটি প্রিন্ট করুন। আপনি অন্য কোথাও থেকে npm run শুরু করলেও npm তার প্যাকেজ ফোল্ডার থেকেই স্ক্রিপ্ট রান করে। কোনো ওয়ার্কস্পেস প্রজেক্টে, নির্বাচিত ওয়ার্কস্পেস প্যাকেজটি সংশ্লিষ্ট ফোল্ডার হতে পারে। নিচের ধাপগুলো আপনাকে সঠিক পাথটি শনাক্ত করতে এবং যে ফোল্ডারে আপনি কমান্ডটি টাইপ করেছিলেন তা থেকে এটিকে আলাদা করতে সাহায্য করবে।
১. আপনি যে প্যাকেজ এবং স্ক্রিপ্টটি রান করছেন তা খুঁজুন
টার্মিনাল খুলুন এবং সেই প্রজেক্ট ফোল্ডারে যান যেখানে আপনি সাধারণত npm রান করেন। টার্মিনালে macOS ডিফল্ট হিসেবে zsh ব্যবহার করে, তবে আপনার শেল পরিবর্তন করা যেতে পারে। আপনার বর্তমান ডিরেক্টরি দেখতে pwd ব্যবহার করুন, তারপর সেই ফোল্ডারে কোনো package.json ফাইল আছে কি না তা দেখতে ফাইলগুলোর তালিকা দেখুন। অ্যাপলের টার্মিনাল গাইড-এ টার্মিনালে কমান্ড দেওয়া এবং ls-এর মতো টুল ব্যবহার করার বিষয়টি ব্যাখ্যা করা হয়েছে।
pwd
ls
কোন প্যাকেজটি স্ক্রিপ্টটি সংজ্ঞায়িত করেছে সে বিষয়ে আপনি নিশ্চিত না হলে, বর্তমান ফোল্ডারে থাকা package.json পরীক্ষা করুন। আপনি এটি cat package.json দিয়ে দেখতে পারেন, অথবা কোনো টেক্সট এডিটরে খুলতে পারেন। scripts অবজেক্টের নিচে স্ক্রিপ্টের নামটি খুঁজুন। উদাহরণস্বরূপ, "scripts": { "build": "node build.js" }-এ রান করার জন্য স্ক্রিপ্টের নাম হলো build। এটি যদি কোনো ওয়ার্কস্পেস রিপোজিটরি হয়, তবে শীর্ষ-স্তরের প্রজেক্ট ফোল্ডারটিই স্ক্রিপ্টের মালিক—এমনটি ধরে নেবেন না।
২. npm-এর প্রত্যাশিত ডিরেক্টরি পরীক্ষা করুন
বর্তমান npm সংস্করণগুলোর জন্য, আপনি যে ডিরেক্টরি থেকেই npm run চালান না কেন, স্ক্রিপ্টগুলো প্যাকেজ ফোল্ডারের রুট থেকেই রান করে। একটি সাধারণ প্রজেক্টে, এটি হলো প্যাকেজের package.json ধারণকারী ফোল্ডার। একটি ওয়ার্কস্পেস প্রজেক্টে, npm একটি নির্বাচিত ওয়ার্কস্পেসের প্রেক্ষাপটে স্ক্রিপ্টটি রান করতে পারে; সেক্ষেত্রে ওয়ার্কস্পেসের প্যাকেজটি পরীক্ষা করতে হবে। স্ক্রিপ্ট ওয়ার্কিং ডিরেক্টরি এবং ওয়ার্কস্পেসে স্ক্রিপ্ট চালানো সম্পর্কিত npm-এর ডকুমেন্টেশন দেখুন।
এই ডকুমেন্টেড আচরণটি একটি ভালো প্রাথমিক উত্তর, তবে স্ক্রিপ্টটি যদি অভ্যন্তরীণভাবে ডিরেক্টরি পরিবর্তন করে অথবা কোনো নির্দিষ্ট কমান্ড কী দেখছে তা নিশ্চিত করার প্রয়োজন হয়, তবে এক্সিকিউশনের সময় পাথটি প্রিন্ট করুন। স্ক্রিপ্টের ভেতরে cd-এর মতো একটি শেল কমান্ড তার পরবর্তী কমান্ডগুলোর জন্য ডিরেক্টরি পরিবর্তন করতে পারে, তাই কেবল প্যাকেজ ফোল্ডারটি সম্পূর্ণ বিষয়টি স্পষ্ট নাও করতে পারে।
৩. স্ক্রিপ্টের ভেতর থেকে ডিরেক্টরি প্রিন্ট করুন
সবচেয়ে পরিষ্কার যাচাইকরণ পদ্ধতি হলো package.json-এ স্ক্রিপ্ট কমান্ডের শুরুতে সাময়িকভাবে pwd যোগ করা। উদাহরণস্বরূপ, এটি পরিবর্তন করুন:
"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 যে ডিরেক্টরি দেখে এটি সেটি রিপোর্ট করে; প্রোগ্রামটি পরবর্তীতে তার ওয়ার্কিং ডিরেক্টরি পরিবর্তন করলে এই মানটি পরিবর্তিত হতে পারে।
৪. ফলাফল পড়ুন এবং ওয়ার্কস্পেসের বিষয়টি বিবেচনা করুন
আপনি npm রান করার আগে pwd দ্বারা প্রদর্শিত পাথের সাথে প্রিন্ট করা পাথের তুলনা করুন। সেগুলো আলাদা হতে পারে: npm-এর স্ক্রিপ্ট ডিরেক্টরি হলো প্যাকেজ রুট, যেখানে আপনার টার্মিনাল ডিরেক্টরি হলো যেখান থেকে আপনি কমান্ডটি চালু করেছিলেন। উদাহরণস্বরূপ, আপনার টার্মিনাল যদি একটি রিপোজিটরি রুটে শুরু হয় কিন্তু আপনি packages/site-এর অধীনস্থ কোনো প্যাকেজ দ্বারা সংজ্ঞায়িত স্ক্রিপ্ট রান করেন, তবে স্ক্রিপ্টের প্যাকেজ প্রেক্ষাপট হতে পারে সেই ওয়ার্কস্পেসটি। npm --workspace দিয়ে একটি নির্বাচন করার বিষয়টি উল্লেখ করে; আপনি ওয়ার্কস্পেস ডিরেক্টরির ভেতর থেকেও একটি স্ক্রিপ্ট রান করতে পারেন।
npm run build --workspace=site
প্রজেক্টের workspaces কনফিগারেশনের সাথে মেলে এমন ওয়ার্কস্পেসের নাম বা পাথ ব্যবহার করুন। আউটপুটটি অপ্রত্যাশিত হলে, আপনি সঠিক স্ক্রিপ্ট এবং ওয়ার্কস্পেস নির্বাচন করেছেন কি না তা নিশ্চিত করুন, তারপর স্ক্রিপ্টটিতে নিজেই cd রয়েছে কি না বা এটি এমন কোনো টুল কল করে কি না যা ডিরেক্টরি পরিবর্তন করে তা পরীক্ষা করুন। একটি চাইল্ড প্রসেসের নিজস্ব ওয়ার্কিং-ডিরেক্টরি সেটিংসও থাকতে পারে; প্যারেন্ট স্ক্রিপ্টের সাথে এর আচরণের অমিল থাকলে সেই টুলের কনফিগারেশন পরীক্ষা করুন।
INIT_CWD আপনাকে কী জানায়
আপনি যখন npm run শুরু করেছিলেন তখন আপনি যে ডিরেক্টরিতে ছিলেন তার জন্য npm INIT_CWD প্রদান করে। স্ক্রিপ্টের যখন জানার প্রয়োজন হয় যে কলার কোথা থেকে শুরু করেছিল, তখন এই মানটি সাহায্য করতে পারে, তবে এটি স্ক্রিপ্টের বর্তমান ওয়ার্কিং ডিরেক্টরি নয়। চলমান প্রসেসটি যে ডিরেক্টরি দেখতে পায় তা পরীক্ষা করতে শেল স্ক্রিপ্টের ভেতরে pwd বা Node.js-এর ভেতরে process.cwd() ব্যবহার করুন। এই পার্থক্যটি বিশেষভাবে কাজে আসে যখন একটি রিলেটিভ ফাইল পাথ একটি ইনভোকেশন অবস্থান থেকে কাজ করে কিন্তু অন্যটি থেকে করে না।
একটি দ্রুত ডায়াগনোসিসের জন্য, npm-এর প্যাকেজ-রুট নিয়ম দিয়ে শুরু করুন, প্রয়োজন হলে কাঙ্ক্ষিত ওয়ার্কস্পেসটি নির্বাচন করুন এবং স্ক্রিপ্টটি যে স্থানে রান করে সেখানে প্রকৃত পাথ নিশ্চিত করতে স্ক্রিপ্টের ভেতরে pwd প্রিন্ট করুন।
সোর্সসমূহ
Scripts — npm Docs
Workspaces — npm Docs
Process — Node.js
Execute commands and run tools in Terminal on Mac — Apple Support
Change the default shell in Terminal on Mac — Apple Support