macOS-এ, প্রথমে শনাক্ত করুন npm কি কোনো Git মার্জ দ্বন্দ্ব, package.json ও package-lock.json-এর মধ্যকার অমিল, নাকি পিয়ার ডিপেন্ডেন্সি সংক্রান্ত কোনো ত্রুটি প্রদর্শন করছে। কোনো কিছু পরিবর্তন করার আগে টার্মিনালে প্রজেক্ট ফাইল, Git স্টেট এবং npm সংস্করণগুলো পরীক্ষা করুন। যদি কেবল লকফাইলটিরই সমন্বয় করার প্রয়োজন হয়, তবে npm-এর --package-lock-only বিকল্পটি node_modules-এ প্যাকেজগুলো পুনরায় ইনস্টল না করেই এটি আপডেট করতে পারে।
প্রজেক্ট ফোল্ডার থেকে শুরু করুন এবং বর্তমান অবস্থাটি সংরক্ষণ করুন
টার্মিনাল খুলুন, প্রজেক্ট ডিরেক্টরিতে যান এবং নিশ্চিত করুন যে আপনি উদ্দিষ্ট প্রজেক্ট রুটে আছেন। ফাইন্ডারে, আপনি ফোল্ডারটি সনাক্ত করতে পারেন, তারপর টার্মিনালের cd কমান্ড ব্যবহার করতে পারেন; পাথে যদি স্পেস থাকে, তবে পাথটি উদ্ধৃতি চিহ্নের মধ্যে রাখুন, উদাহরণস্বরূপ cd "$HOME/Projects/My App"। রান করুন:
pwd
git status --short
node --version
npm --version
git status --short দেখায় যে কোনো ম্যানিফেস্টে আনকমিটেড কোনো পরিবর্তন আছে কিনা। যদি এমন কোনো পরিবর্তন থাকে যা আপনার রাখা প্রয়োজন, তবে এগিয়ে যাওয়ার আগে সেগুলো সেভ বা কমিট করুন; কোন ডিপেন্ডেন্সির পরিবর্তনগুলো রাখা প্রয়োজন তা সিদ্ধান্ত নেওয়ার সময় ফাইলগুলো ওভাররাইট করবেন না। Node.js এবং npm সংস্করণগুলো রেকর্ড করে রাখুন যাতে আপনি প্রজেক্টের ডকুমেন্ট করা সেটআপ বা কন্টিনিউয়াস ইন্টিগ্রেশন কনফিগারেশনের সাথে সেগুলোর তুলনা করতে পারেন। প্রধান প্রধান npm সংস্করণের সাথে সাথে npm লকফাইলের ফরম্যাটেও পরিবর্তন এসেছে, তাই ফরম্যাটের পার্থক্য অপ্রত্যাশিত পরিবর্তনের কারণ ব্যাখ্যা করতে পারে, যা ডিপেন্ডেন্সিগুলো নষ্ট হয়ে গেছে তা প্রমাণ করে না। npm-এর package-lock সম্পর্কিত ডকুমেন্টেশন
আপনার ঠিক কী ধরণের দ্বন্দ্ব তৈরি হয়েছে তা নির্ধারণ করুন
যদি package-lock.json-এ <<<<<<<, =======, বা >>>>>>>-এর মতো Git মার্কার থাকে, তবে এটি একটি সোর্স কন্ট্রোল মার্জ সংক্রান্ত দ্বন্দ্ব। প্রভাবিত পুরো অংশগুলো সতর্কতার সাথে পরীক্ষা করুন এবং উভয় ব্রাঞ্চের পরিবর্তনের তুলনা করুন। প্রথমে package.json-এর ডিপেন্ডেন্সি ডিক্লারেশনের সমাধান করুন: npm-এর পুরোনো লকফাইল দ্বন্দ্ব নির্দেশিকায় স্পষ্ট বলা হয়েছে যে লকফাইলটি পুনরায় তৈরি করার আগে ম্যানুয়ালি ম্যানিফেস্ট দ্বন্দ্ব সমাধান করতে হবে। অভ্যাসবশত কেবল লকফাইলের যেকোনো এক পাশ রেখে দেবেন না; প্রতিটি ব্রাঞ্চই হয়তো ডিপেন্ডেন্সি যুক্ত বা পরিবর্তন করেছে। npm-এর package-lock দ্বন্দ্ব নির্দেশিকা
যদি কোনো Git মার্কার না থাকে, তবে লকফাইলের সাথে package.json-এর ডিপেন্ডেন্সির নাম এবং রেঞ্জগুলো তুলনা করুন। package.json গ্রহণযোগ্য রেঞ্জগুলো নির্দিষ্ট করে, অন্যদিকে লকফাইলটি একটি সমাধানকৃত ডিপেন্ডেন্সি ট্রির রেকর্ড রাখে। বর্তমান npm ডকুমেন্টেশন অনুসারে, একটি সাধারণ npm install লক করা সংস্করণগুলো ব্যবহার করে যখন সেগুলো ম্যানিফেস্টের রেঞ্জ পূরণ করে, এবং পূরণ না হলে লকটি আপডেট করে। কীভাবে npm install একটি লকফাইল ব্যবহার করে
যদি কমান্ডটি কোনো পিয়ার ডিপেন্ডেন্সির বার্তা দিয়ে ব্যর্থ হয়, তবে সেই ত্রুটিতে উল্লিখিত প্যাকেজগুলো এবং তাদের পিয়ার রিকোয়ারমেন্টগুলোর ওপর নজর দিন। এটি ঘোষিত প্যাকেজ রেঞ্জগুলোর মধ্যে একটি বাস্তব অসঙ্গতি হতে পারে, কোনো নষ্ট ইনস্টলেশন নয়। ডায়াগনস্টিক শর্টকাট হিসেবে --force বা --legacy-peer-deps ব্যবহার করবেন না: ডিপেন্ডেন্সি সমাধানের আচরণ পরিবর্তন করলে এমন একটি ট্রি তৈরি হতে পারে যা প্রজেক্টের উদ্দিষ্ট সেটআপ থেকে ভিন্ন।
npm-কে সমন্বয় করতে বলার আগে পরিবর্তনটি পরীক্ষা করুন
প্রজেক্টের হিস্ট্রি এবং বর্তমান ডিফ পর্যালোচনা করুন:
git diff -- package.json package-lock.json
git log -5 --oneline -- package.json package-lock.json
যে কমিট বা ব্রাঞ্চ ডিপেন্ডেন্সি ডিক্লারেশন, লকফাইলের সংস্করণ বা npm কনফিগারেশন পরিবর্তন করেছে তা খুঁজে বের করুন। এছাড়াও প্রজেক্টে কোনো .npmrc আছে কিনা তা পরীক্ষা করুন; npm উল্লেখ করে যে legacy-peer-deps বা install-links-এর মতো ট্রি-শেপিং বিকল্পগুলো একটি লকফাইল এবং পরবর্তীতে হওয়া ক্লিন ইনস্টলের মধ্যে সামঞ্জস্য থাকবে কিনা তা প্রভাবিত করতে পারে। এলোমেলোভাবে নতুন ফ্ল্যাগ যোগ করার পরিবর্তে রিপোজিটরিতে ইতিমধ্যে গৃহীত নির্দিষ্ট প্রজেক্ট সেটিংস ব্যবহার করুন। npm ci ডকুমেন্টেশন
একটি lockfileVersion মান ফাইলের ফরম্যাট শনাক্ত করতে সাহায্য করে, তবে এটিকে একা রোগ নির্ণয় বা ডায়াগনসিস হিসেবে বিবেচনা করা এড়িয়ে চলুন। npm ফরম্যাট সংস্করণ 1, 2, এবং 3 নথিভুক্ত করে এবং উল্লেখ করে যে নতুন npm সংস্করণগুলো পুরোনো লকফাইল আপডেট করতে পারে। একটি পরিবর্তিত সংস্করণ npm-এর সামঞ্জস্যপূর্ণ আচরণ প্রতিফলিত করতে পারে; একটি বড় ধরণের পরিবর্তন গ্রহণ করার আগে প্রকৃত ডিপেন্ডেন্সি ডিফ পরীক্ষা করুন। লকফাইল ফরম্যাট এবং পুরোনো ফাইলসমূহ
ডিপেন্ডেন্সি পুনরায় ইনস্টল না করেই লকফাইলের সমন্বয় করুন
যেকোনো দ্বন্দ্বের মার্কার সমাধান করার পর এবং package.json সঠিক করার পরে, npm-কে শুধুমাত্র লকফাইলটি আপডেট করতে বলুন:
npm install --package-lock-only
npm এই বিকল্পটিকে node_modules পরীক্ষা না করে বা ডিপেন্ডেন্সি ডাউনলোড না করে package-lock.json আপডেট করা হিসেবে নথিভুক্ত করে। এটি একটি সুনির্দিষ্ট সমন্বয়মূলক পদক্ষেপ; এটি নিশ্চিত করে না যে ফলাফলস্বরূপ পাওয়া ডিপেন্ডেন্সির সেটটিই আপনার কাঙ্ক্ষিত ছিল, তাই পরবর্তীতে ডিফটি পরীক্ষা করুন। npm install বিকল্পসমূহ
git diff --check
git diff -- package.json package-lock.json
git status --short
git diff --check হোয়াইটস্পেস সংক্রান্ত ত্রুটিগুলো ধরতে সাহায্য করে, অন্যদিকে ডিফটি নিজেই দেখায় npm কী পরিবর্তন করেছে। নিশ্চিত করুন যে ম্যানিফেস্টে কোনো অনাকাঙ্ক্ষিত পরিবর্তন আসেনি, অপ্রত্যাশিত সংস্করণ পরিবর্তন বা বিস্তৃত লকফাইল পুনর্লিখন পরীক্ষা করুন এবং যাচাই করুন যে দ্বন্দ্বের মার্কারগুলো দূর হয়েছে। প্রস্তাবিত পরিবর্তনগুলো যদি যৌক্তিক মনে না হয়, তবে node_modules মুছে ফেলা বা সবকিছু পুনরায় তৈরি করার পরিবর্তে আপনার সংরক্ষিত অবস্থা বা সোর্স কন্ট্রোল থেকে ফাইলগুলো পুনরুদ্ধার করুন এবং কারণটি পুনরায় খতিয়ে দেখুন।
একটি ক্লিন ইনস্টল কখন উপযুক্ত তা জানুন
npm ci শুধুমাত্র তখনই ব্যবহার করুন যখন ম্যানিফেস্ট এবং লকফাইল ইচ্ছাকৃতভাবে সারিবদ্ধ করা হয়েছে এবং আপনি লক করা ডিপেন্ডেন্সি ট্রিটি পুনরুত্পাদন করতে চান। এর জন্য একটি লকফাইল প্রয়োজন, কোনো অসঙ্গতি থাকলে এটি আপডেট করার পরিবর্তে ব্যর্থ হয় এবং ইনস্টল করার আগে বিদ্যমান node_modules ডিরেক্টরিটি সরিয়ে ফেলে। এটি একটি সমাধানকৃত অবস্থা নিশ্চিত করার জন্য কার্যকর, তবে এটি নিরীক্ষণ করার কোনো নির্দোষ কমান্ড নয়। npm ci-এর আচরণ
যদি npm install --package-lock-only দ্বন্দ্বটি সমাধান করতে না পারে, তবে এর সঠিক ত্রুটিটি ধারণ করুন, উল্লিখিত প্যাকেজ রেঞ্জ এবং প্রজেক্টের npm সেটিংস পর্যালোচনা করুন এবং যে ব্রাঞ্চ বা CI পরিবেশে লকফাইলটি তৈরি হয়েছিল তার সাথে তুলনা করুন। সবচেয়ে গুরুত্বপূর্ণ প্রশ্ন হলো প্রজেক্টটির কোন ডিপেন্ডেন্সি ডিক্লারেশনগুলো রাখা উচিত; ইনস্টলেশন ক্লিনআপ আপনার জন্য সেই উত্তর দিতে পারবে না। একবার সেই সিদ্ধান্তটি package.json-এ প্রতিফলিত হলে, কেবল লকফাইলটি পুনরায় তৈরি করুন, প্রস্তাবিত পরিবর্তনটি পরীক্ষা করুন এবং তারপর বেছে নিন একটি ক্লিন ইনস্টল প্রয়োজন কিনা।
উৎসসমূহ
npm install — npm
npm ci — npm
package-lock.json — npm
package-locks — npm