ম্যাক-এ npm প্যাকেজগুলোর মধ্যে একটি ডিপেন্ডেন্সি অ্যালাইন করতে, প্রথমে প্রতিটি ওয়ার্কস্পেসের package.json-এ ভার্সন রেঞ্জগুলো তুলনা করুন, প্রতিটি প্যাকেজের জন্য কোন সাধারণ ভার্সন রেঞ্জটি উপযুক্ত তা নির্ধারণ করুন, তারপর ক্ষতিগ্রস্ত প্রতিটি ওয়ার্কস্পেস আপডেট করুন এবং রুট লকফাইলটি পুনরায় জেনারেট করুন। npm workspaces রিপোজিটরির রুট থেকে প্যাকেজগুলোকে টার্গেট করতে পারে, তবে এতে এমন কোনো বিল্ট-ইন কমান্ড নেই যা প্রতিটি ম্যানিফেস্ট স্ক্যান করে ডিপেন্ডেন্সি ভার্সনগুলোকে স্বয়ংক্রিয়ভাবে হুবহু এক রকম করে তোলে।
১. রিপোজিটরিটি npm workspaces ব্যবহার করছে কিনা তা পরীক্ষা করুন
টার্মিনালে, রিপোজিটরির রুটে যান এবং এর কনফিগারেশন পরীক্ষা করুন:
cd "/path/to/your/repository"
npm --version
npm pkg get workspaces
রুট package.json-এ ওয়ার্কস্পেসের পাথগুলো সংজ্ঞায়িত থাকা উচিত এবং প্রতিটি প্যাকেজের নিজস্ব package.json থাকা উচিত। npm-এর ওয়ার্কস্পেস ফিচার ইনস্টলেশনের সময় সেই লোকাল প্যাকেজগুলোকে লিঙ্ক করে এবং কমান্ডের মাধ্যমে নাম বা পাথ অনুসারে এক বা একাধিক ওয়ার্কস্পেসকে টার্গেট করার সুবিধা দেয়। যদি npm pkg get workspaces কোনো আউটপুট না দেয়, তবে npm ওয়ার্কস্পেস কমান্ডগুলো ব্যবহারের আগে রিপোজিটরির প্যাকেজ ম্যানেজার এবং লেআউট নিশ্চিত করে নিন। npm Workspaces
২. ডিপেন্ডেন্সি ডিক্লারেশনগুলো তুলনা করুন
আপনি যে ডিপেন্ডেন্সিটি অ্যালাইন করতে চান তার জন্য ট্র্যাক করা ম্যানিফেস্টগুলোতে অনুসন্ধান করুন। উদাহরণস্বরূপ, macOS টার্মিনালে আপনি কোনো অতিরিক্ত টুল ইনস্টল না করেই grep ব্যবহার করতে পারেন:
grep -n '"typescript"' package.json packages/*/package.json
typescript-এর জায়গায় আপনার ডিপেন্ডেন্সির নামটি বসান। এটি একটি দ্রুত টেক্সট যাচাইকরণ, তাই প্যাকেজটি dependencies, devDependencies, peerDependencies, নাকি optionalDependencies-এর অধীনে রয়েছে তা দেখতে প্রতিটি ম্যানিফেস্টের সংশ্লিষ্ট বিভাগগুলো পর্যালোচনা করুন। এই ফিল্ডগুলো বিভিন্ন ভূমিকা নির্দেশ করে; শুধুমাত্র ভার্সন স্ট্রিংগুলোকে হুবহু মেলাতে ডিপেন্ডেন্সিকে এগুলোর একটি থেকে অন্যটিতে সরিয়ে নেবেন না। আরও বিস্তারিত তালিকার জন্য, আপনার এডিটরে প্রতিটি ওয়ার্কস্পেস ম্যানিফেস্ট পরীক্ষা করুন অথবা npm-এর ওয়ার্কস্পেস-সচেতন লিস্টিং কমান্ড ব্যবহার করুন:
npm ls typescript --workspaces --depth=0
ম্যানিফেস্টের রেঞ্জ এবং ইনস্টল করা ট্রি দুটি ভিন্ন প্রশ্নের উত্তর দেয়: প্রথমটি দেখায় প্রতিটি প্যাকেজ কী অনুমতি দেয়, আর npm ls ইনস্টল করা ডিপেন্ডেন্সির অবস্থা রিপোর্ট করে। npm-এর লকফাইল মীমাংসিত (resolved) ভার্সনগুলো রেকর্ড করে, কিন্তু এটি প্রতিটি package.json-এ ঘোষিত গ্রহণযোগ্য রেঞ্জগুলোকে প্রতিস্থাপন করে না। npm ls package-lock.json and npm install
৩. একটি সামঞ্জস্যপূর্ণ ভার্সন নীতি বেছে নিন
এমন একটি ভার্সন বাছুন যা ব্যবহারকারীদের প্রয়োজনীয়তা এবং রিপোজিটরির সাপোর্ট পলিসি উভয়কেই পূরণ করে। একটি শেয়ার্ড ভার্সন রেঞ্জের অর্থ হলো প্যাকেজগুলো একই অনুমোদিত সেট প্রকাশ করছে; এটি নিশ্চিত করে না যে সমস্ত নেস্টেড বা ট্রানজিটিভ কপি একটি একক ইনস্টল করা কপিতেই মীমাংসিত হবে। প্যাকেজগুলোকে কোনো মেজর ভার্সনে স্থানান্তর করার আগে পিয়ার ডিপেন্ডেন্সির প্রয়োজনীয়তা এবং ব্রেকিং পরিবর্তনের জন্য রিলিজ নোটগুলো দেখে নিন। ব্যবহারকারীদের যদি আরও বিস্তৃত সামঞ্জস্যপূর্ণ রেঞ্জের প্রয়োজন হয়, তবে হুবহু একই স্ট্রিং-এ অ্যালাইন করা অনুপযুক্ত হতে পারে; এর পরিবর্তে সমমানের কোনো রেঞ্জ নীতিতে সম্মত হন।
উদাহরণস্বরূপ, web এবং api নামের দুটি ওয়ার্কস্পেসে একটি ডেভেলপমেন্ট টুলকে হুবহু একই ভার্সনে সেট করতে, রুট থেকে এটি রান করুন:
npm install --save-dev --save-exact typescript@5.8.3 --workspace=web --workspace=api
আপনার প্রজেক্টের জন্য নির্বাচিত ভার্সনটি ব্যবহার করুন; এখানে 5.8.3 কেবল একটি উদাহরণ। npm-এর ইনস্টল কমান্ড ওয়ার্কস্পেস সিলেক্টর গ্রহণ করে এবং নির্বাচিত প্রতিটি প্যাকেজ ম্যানিফেস্টে প্যাকেজটি সেভ করে। --save-exact npm-এর স্বাভাবিক রেঞ্জ অপারেটরের বদলে হুবহু নির্দিষ্ট ভার্সনটি লেখে। রানটাইম ডিপেন্ডেন্সির জন্য, --save-dev-এর পরিবর্তে উপযুক্ত সেভ ক্যাটাগরি, যেমন --save-prod ব্যবহার করুন। npm install
অতিরিক্ত ওয়ার্কস্পেস সিলেক্টরের সাথে এটি পুনরায় করুন অথবা প্রতিটি ওয়ার্কস্পেসের জন্য কমান্ডটি আলাদাভাবে চালান। ধরে নেবেন না যে রুট-লেভেলের ইনস্টলেশন প্রতিটি প্যাকেজ ম্যানিফেস্টকে আপডেট করবে: যে প্যাকেজগুলোর ডিক্লারেশন পরিবর্তন করা প্রয়োজন সেগুলোকে স্পষ্টভাবে টার্গেট করুন। রুট প্যাকেজটিতেও যখন একই ডিপেন্ডেন্সি ঘোষণা করার প্রয়োজন হয়, তখন সেটিকেও ইচ্ছাকৃতভাবে --include-workspace-root দিয়ে অন্তর্ভুক্ত করা যেতে পারে।
৪. পুনরায় ইনস্টল করুন, diff পরীক্ষা করুন এবং যাচাই করুন
ডিক্লারেশনগুলো আপডেট করার পর, রিপোজিটরির রুটে ইনস্টলেশন রান করুন যাতে npm ওয়ার্কস্পেস ট্রি এবং লকফাইলের সমন্বয় সাধন করতে পারে:
npm install
npm ls typescript --workspaces --depth=0
git diff -- package.json package-lock.json packages/*/package.json
উদ্দিষ্ট প্রতিটি ম্যানিফেস্টে সম্মত ডিক্লারেশন রয়েছে কিনা এবং লকফাইলের পরিবর্তনটি প্রত্যাশিত কিনা তা পরীক্ষা করুন। রিপোজিটরির সংশ্লিষ্ট বিল্ড বা টেস্ট স্ক্রিপ্টগুলো চালান; নির্বাচিত ভার্সনটির সাথে কোড কাজ করছে কিনা তা কেবল npm ls দিয়ে নিশ্চিত করা যায় না। প্রজেক্টটি ট্র্যাক করলে রুট package-lock.json কমিট করুন, যাতে টিমের অন্য সদস্যরাও একই ইনস্টল করা ট্রি পুনরুৎপাদন করতে পারে। npm package-lock documentation
যদি npm কোনো অবৈধ ডিপেন্ডেন্সি বা পিয়ার কনফ্লিক্ট রিপোর্ট করে, তবে জোরপূর্বক ইনস্টল করার পরিবর্তে ত্রুটিতে উল্লেখিত প্যাকেজটি পরীক্ষা করুন। কোনো একটি ওয়ার্কস্পেসের জন্য হয়তো ভিন্ন সামঞ্জস্যপূর্ণ রেঞ্জের প্রয়োজন হতে পারে, অথবা অন্য কোনো ডিপেন্ডেন্সি এমন পিয়ার শর্তারোপ করতে পারে যার জন্য একটি সুনির্দিষ্ট আপগ্রেড পরিকল্পনা দরকার।
যখন npm dedupe কাজে আসে
npm dedupe সামঞ্জস্যপূর্ণ ডিপেন্ডেন্সিগুলোকে ওপরের স্তরে সরিয়ে ইনস্টল করা ডিপেন্ডেন্সি ট্রি-কে সহজ করতে পারে যাতে প্যাকেজগুলো সেগুলোকে শেয়ার করতে পারে। এটি package.json-এ সরাসরি থাকা ডিপেন্ডেন্সি রেঞ্জগুলোকে পুনর্লিখন করে না, তাই এটি নিজে থেকে ডিক্লারেশনগুলো অ্যালাইন করতে পারে না। রেঞ্জগুলো সামঞ্জস্যপূর্ণ কিনা তা যাচাই করার পরেই কেবল এটি ব্যবহার করুন, এবং তারপর প্রাপ্ত লকফাইল diff পর্যালোচনা করুন। npm dedupe
একটি নির্ভরযোগ্য পরিসমাপ্তির জন্য প্রয়োজন প্রতিটি সংশ্লিষ্ট ওয়ার্কস্পেস ম্যানিফেস্টে প্রকাশিত একটি সুচিন্তিত নীতি, একটি পুনরায় তৈরি করা লকফাইল এবং ক্ষতিগ্রস্ত প্যাকেজগুলোর যাচাইকরণ। এটি রক্ষণাবেক্ষণকারীদের কী অ্যালাইন করা হয়েছে তার একটি স্পষ্ট রেকর্ড প্রদান করে এবং অসামঞ্জস্যপূর্ণ সীমাবদ্ধতাগুলোকে একটি পৃথক সিদ্ধান্তের জন্য দৃশ্যমান রাখে।
সূত্রসমূহ
Workspaces — npm
npm install — npm
npm ls — npm
package-lock.json — npm
npm-dedupe — npm