node.js new কেন প্লাগিন জন্য npm মধ্যে পিয়ার নির্ভরতা ব্যবহার?




npm install windows (2)

কেন, উদাহরণস্বরূপ, একটি গ্রান্ট প্লাগইনটি " পিয়ার নির্ভরতা " হিসাবে কৃপণতার উপর তার নির্ভরতা সংজ্ঞায়িত করে?

কেন প্লাগিনটি গ্রান্ট-প্লাগ / node_modules এর নিজস্ব নির্ভরতা হিসাবে গ্রান্ট করতে পারে না?

পিয়ার নির্ভরতা এখানে বর্ণিত হয়েছে: https://nodejs.org/en/blog/npm/peer-dependencies/

কিন্তু আমি সত্যিই এটা পেতে না।

উদাহরণ

আমি এই মুহূর্তে অ্যাপজিভার স্টেরয়েডসের সাথে কাজ করছি যা একটি স্থানীয় ডিভাইসে পরিবেশিত একটি / ডিস্ট / ফোল্ডারে আমার উৎস ফাইলগুলি তৈরি করতে গ্রান্ট কাজগুলি ব্যবহার করে। আমি npm এ বেশ নতুন এবং grunt তাই আমি কি ঘটছে তা সম্পূর্ণরূপে বোঝাতে চান।

এ পর্যন্ত আমি এই পেতে:

[rootfolder] /package.json এনপিএম কে বলে এটি ডেভেলপমেন্টের জন্য grunt-steroids এনপিএম প্যাকেজে নির্ভর করে:

  "devDependencies": {
    "grunt-steroids": "0.x"
  },

ঠিক আছে. [Rootfolder] এ এনপিএম ইনস্টল করা নির্ভরতা সনাক্ত করে এবং গ্রান্ট-স্টেরয়েডগুলি [rootfolder] / node_modules / grunt-steroids এ ইনস্টল করে

Npm তারপর [rootfolder] / node_modules/ grunt-steroids package.json পড়তে থাকে যাতে এটি grunt-steroids নিজস্ব নির্ভরতা ইনস্টল করতে পারে .:

"devDependencies": {
    "grunt-contrib-nodeunit": "0.3.0",
    "grunt": "0.4.4"
  },
"dependencies": {
    "wrench": "1.5.4",
    "chalk": "0.3.0",
    "xml2js": "0.4.1",
    "lodash": "2.4.1"
  },
"peerDependencies": {
    "grunt": "0.4.4",
    "grunt-contrib-copy": "0.5.0",
    "grunt-contrib-clean": "0.5.0",
    "grunt-contrib-concat": "0.4.0",
    "grunt-contrib-coffee": "0.10.1",
    "grunt-contrib-sass": "0.7.3",
    "grunt-extend-config": "0.9.2"
  },

" নির্ভরতা " প্যাকেজগুলি [rootfolder] / node_modules / grunt-steroids / node_modules এ ইনস্টল করা যা আমার জন্য যৌক্তিক।

" Devdependencies " ইনস্টল করা হয় না, যা আমি নিশ্চিত করছি npm সনাক্তকরণ দ্বারা নিয়ন্ত্রিত হয় আমি grunt-steroids ব্যবহার করার চেষ্টা করছি, এবং এটির উপর বিকাশ করব না।

কিন্তু তারপর আমরা " peerdependencies " আছে।

এটি [rootfolder] / node_modules এ ইনস্টল করা আছে এবং আমি বুঝতে পারছি না কেন [rootfolder] / node_modules / grunt-steroids / node_modules এতে নেই এবং অন্যান্য গ্রান্ট প্লাগিন (বা যাই হোক না কেন) এর সাথে দ্বন্দ্ব এড়িয়ে চলছে?


টিএল; ডিআর: [1] peerDependencies নির্ভরতাগুলি নির্ভরশীলতাগুলির জন্য, যা উন্মুক্ত নয় এমন ( "ব্যক্তিগত" নির্ভরতা) উন্মুক্ত নয় এবং এটি কেবল একটি বাস্তবায়ন বিশদ।

সমস্যা সহকর্মী নির্ভরতা সমাধান

এনপিএম এর মডিউল সিস্টেম অনুক্রমিক। সহজ পরিস্থিতিতে একটি বড় সুবিধা হল যে যখন আপনি একটি npm প্যাকেজ ইনস্টল করেন, তখন সেই প্যাকেজটি তার নিজস্ব নির্ভরতাগুলি এনে দেয় যাতে এটি বাক্সে কাজ করে।

কিন্তু সমস্যা যখন উত্থাপিত হয়:

  • আপনার প্রকল্প এবং কিছু মডিউল আপনি ব্যবহার করছেন উভয় অন্য মডিউল উপর নির্ভর করে।
  • তিনটি মডিউল একে অপরের সাথে কথা বলতে হবে।

উদাহরণে

ধরুন আপনি আপনার JacksModule 1.0 করছেন এবং আপনি JacksModule 1.0 এবং JillsModule 2.0 ব্যবহার করছেন। এবং ধরুন JacksModule উপর নির্ভর করে, তবে একটি ভিন্ন সংস্করণে 1.0 বলে। যে 2 সংস্করণ পূরণ না হওয়া পর্যন্ত, কোন সমস্যা নেই। JacksModule JillsModule নীচে নিচের JillsModule ব্যবহার JillsModule তা কেবল একটি বাস্তবায়ন বিশদ। আমরা JillsModule দ্বিগুণ করে JillsModule , কিন্তু বাক্সের স্থিতিশীল সফ্টওয়্যার পাওয়ার সময় এটি একটি ছোট দাম।

কিন্তু এখন যদি JacksModule JillsModule কিছু ভাবে JillsModule তার নির্ভরতা প্রকাশ করে। এটি উদাহরণস্বরূপ JillsClass একটি উদাহরণ গ্রহণ করে ... লাইব্রেরির সংস্করণ 2.0 ব্যবহার করে একটি new JillsClass তৈরি করার সময় এবং jacksFunction বরাবর পাস করলে jacksFunction ? সব নরক ভেঙে ফেলবে! jillsObject instanceof JillsClass হঠাৎ false ফিরে আসবে কারণ jillsObject আসলে অন্য JillsClass এর একটি উদাহরণ, 2.0 সংস্করণ।

কিভাবে পিয়ার নির্ভরতা এই সমাধান

তারা npm বলতে

আমি এই প্যাকেজ প্রয়োজন, কিন্তু আমি প্রকল্পের অংশ যে প্রয়োজন, আমার মডিউল কিছু ব্যক্তিগত সংস্করণ নয়।

যখন npm দেখায় যে আপনার প্যাকেজটি এমন কোনও প্রকল্পে ইনস্টল করা হচ্ছে যার উপর নির্ভরশীলতা নেই, বা এটিটির একটি অসঙ্গতিপূর্ণ সংস্করণ রয়েছে, এটি ইনস্টলেশনের সময় ব্যবহারকারীকে সতর্ক করবে।

আপনি পিয়ার নির্ভরতা ব্যবহার করা উচিত?

  • যখন আপনি অন্য প্রকল্পগুলির দ্বারা ব্যবহারযোগ্য একটি লাইব্রেরি নির্মাণ করছেন, এবং
  • এই লাইব্রেরি কিছু অন্যান্য লাইব্রেরি ব্যবহার করা হয়, এবং
  • আপনি ব্যবহারকারীর সেই অন্যান্য লাইব্রেরির সাথে কাজ করার আশা / প্রয়োজন

সাধারণ পরিস্থিতিতে বৃহত্তর কাঠামোর জন্য প্লাগইন। Gulp, Grunt, Babel, Mocha ইত্যাদি বিষয়গুলি নিয়ে চিন্তা করুন। যদি আপনি একটি গুলপ প্লাগইন লিখেন তবে আপনি সেই প্লাগইনটি একই গুলপের সাথে কাজ করতে চান যা ব্যবহারকারীর প্রকল্পটি ব্যবহার করছে, গুলপের নিজস্ব ব্যক্তিগত সংস্করণের সাথে নয়।

টীকা

  1. অতিদীর্ঘ; পড়া হয়নি। এমন একটি পাঠ্যের জন্য সংক্ষিপ্ত সংক্ষিপ্তসার নির্দেশ করার জন্য ব্যবহৃত হয় যা খুব দীর্ঘ বলে মনে করা হয়।

আমি আপনাকে আবার নিবন্ধটি পড়তে সুপারিশ করবে। এটি একটি বিভ্রান্তিকর তবে উইনস্টন-মেলের উদাহরণটি আপনাকে কেন উত্তর দেয়:

উদাহরণস্বরূপ, আসুন [email protected] নির্দিষ্ট "winston": "0.5.x" [email protected] "winston": "0.5.x" এর "dependencies" বস্তুর মধ্যে জাহির করি কারণ এটি সর্বশেষ সংস্করণটির বিরুদ্ধে এটি পরীক্ষা করা হয়েছিল। একটি অ্যাপ্লিকেশন বিকাশকারী হিসাবে, আপনি সর্বশেষ এবং সর্বশ্রেষ্ঠ স্টাফ চান, তাই আপনি উইনস্টন এবং উইনস্টন winston-mail সর্বশেষ সংস্করণগুলি সন্ধান করুন এবং আপনার প্যাকেজ.জসন হিসাবে এটিকে রাখুন

{
  "dependencies": {  
    "winston": "0.6.2",  
    "winston-mail": "0.2.3"  
  }  
}

কিন্তু এখন, অপ্রত্যাশিত নির্ভরতা গ্রাফের মধ্যে Npm ইনস্টল ফলাফল চলছে

├── [email protected].6.2  
└─┬ winston-[email protected].2.3                
  └── [email protected].5.11

এই ক্ষেত্রে, প্যাকেজের একাধিক সংস্করণ থাকতে পারে যা কিছু সমস্যা সৃষ্টি করবে। পিয়ার নির্ভরতা npm ডেভেলপারদের নিশ্চিত করতে দেয় যে ব্যবহারকারী নির্দিষ্ট মডিউল (মূল ফোল্ডারে) আছে। কিন্তু আপনি সেই পয়েন্টের সাথে সঠিক যে প্যাকেজের একটি নির্দিষ্ট সংস্করণ বর্ণনা করে অন্যান্য সংস্করণগুলি ব্যবহার করে অন্যান্য প্যাকেজগুলির সাথে সমস্যা সৃষ্টি করবে। নিবন্ধটি বলে যে এই সমস্যাটি এনএমপি ডেভেলপারদের সাথে করতে হবে

পরামর্শের এক টুকরা : নিয়মিত নির্ভরশীলতার জন্য তাদের মতামত, পিয়ার নির্ভরতা প্রয়োজনীয়তা, লেনদেন হওয়া উচিত । আপনি আপনার প্যারার নির্ভরতা নিচে নির্দিষ্ট প্যাচ সংস্করণ লক করা উচিত নয়।

অতএব বিকাশকারীদের peerdependencies সংজ্ঞা জন্য সেমিভার অনুসরণ করা উচিত। আপনি GitHub উপর grunt-steroids প্যাকেজ জন্য একটি সমস্যা খোলা উচিত ...





package-managers