প্লাগইনগুলির জন্য এনপিএমে পিয়ার নির্ভরতা কেন ব্যবহার করবেন?


217

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

গ্রাগান্ট-প্লাগ / নোড_মডিউলগুলিতে প্লাগইনটির গ্রান্টকে তার নিজস্ব নির্ভরতা হিসাবে থাকতে পারে না কেন ?

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

তবে আমি আসলে এটি পাই না।

উদাহরণ

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

এখন পর্যন্ত আমি এটি পেয়েছি:

[রুটফোল্ডার] / প্যাকেজ.জসন এনপিএমকে বলে যে এটি grunt-steroidsউন্নয়নের জন্য এনপিএম প্যাকেজের উপর নির্ভর করে :

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

ঠিক আছে. [রুটফোল্ডার] এ এনপিএম ইনস্টল চালানো নির্ভরতা সনাক্ত করে এবং [রুটফোল্ডার] / নোড_মডিউলস / গ্রান্ট-স্টেরয়েডগুলিতে গ্রান্ট-স্টেরয়েড ইনস্টল করে

এনপিএম এর পরে [রুটফোল্ডার] /node_modules/grunt-teroids/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"
  },

" নির্ভরতা " প্যাকেজগুলি [রুটফোল্ডার] / নোড_মডিউলস / গ্রেন্ট-স্টেরয়েডস / নোড_মডিউলগুলিতে ইনস্টল করা আছে যা আমার পক্ষে যৌক্তিক।

" ডিভডিপেন্ডেন্সিগুলি " ইনস্টল করা হয়নি, যা নিশ্চিত যে এনপিএম দ্বারা আমি কেবল ব্যবহারের চেষ্টা করছি grunt-steroidsএবং এটিতে বিকাশ করছি না এটি নিয়ন্ত্রণ করে sure

তবে তারপরে আমাদের " পিয়ার ডিপেন্ডেন্সিগুলি " রয়েছে।

এগুলি [রুটফোল্ডার] / নোড_মডিউলগুলিতে ইনস্টল করা আছে এবং আমি বুঝতে পারি না কেন সেখানে এবং [রুটফোল্ডার] / নোড_মডিউলগুলি / গ্রান্ট-স্টেরয়েডস / নোড_মডিউলগুলিতে নেই যাতে অন্যান্য গ্রান্ট প্লাগইনগুলির (বা যে কোনও কিছু) এড়ানো যেতে পারে?

উত্তর:


420

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

সমস্যাটি পিয়ারের নির্ভরতাগুলি সমাধান করে

এনপিএমের মডিউল সিস্টেমটি শ্রেণিবদ্ধ। সহজ দৃশ্যের জন্য একটি বড় সুবিধা হ'ল আপনি যখন এনপিএম প্যাকেজ ইনস্টল করেন, সেই প্যাকেজটি তার সাথে নিজস্ব নির্ভরতা নিয়ে আসে তাই এটি বাক্সের বাইরে চলে।

তবে সমস্যাগুলি দেখা দেয় যখন:

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

উদাহরণে

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

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

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

তারা এনপিএম বলে

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

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

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

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

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


টীকা

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

2
একটি গুরুত্বপূর্ণ জিনিস আমি লক্ষ্য করেছি এবং কোথাও বলা হয় নি, যখন আমরা প্লাগইন তৈরি করি তখন পীরের নির্ভরতার জন্য আমাদের কী প্যাকেজ নির্ভরতার নকল থাকা উচিত? "grunt": "0.4.4"ওপির উদাহরণে, আমরা দেখতে পাচ্ছি যে এটি ডেভিনিডেন্সি এবং পিয়ারডেপেন্ডেন্স উভয় ক্ষেত্রেই রয়েছে এবং আমার সেখানে একটি সদৃশ থাকাও বোধগম্য হয় কারণ এর অর্থ উভয়ই gruntআমার নিজের ব্যবহারের জন্য সেই প্যাকেজটির প্রয়োজন , তবে আমার ব্যবহারকারীরাও লাইব্রেরিটি তাদের নিজস্ব সংস্করণটি ব্যবহার করতে পারে, যতক্ষণ না এটি পিয়ার নির্ভরতা সংস্করণ লকটিকে সম্মান করে। এটা কি ঠিক? নাকি ওপি উদাহরণটি খুব খারাপ?
ভাদোরকোয়েস্ট

4
আমি গ্রান্টের প্ল্যান্ট গ্রান্টের অনুরাগী হিসাবে তৈরি করা লোকদের কল্পনা করতে পারি :) তাদের গ্রাউন্টকে তাদের প্লাগইন তৈরির প্রক্রিয়াটির জন্য নিজেরাই ব্যবহার করা স্বাভাবিক বলে মনে হয় .... তবে তারা গ্রান্ট সংস্করণটি তাদের প্লাগইন কাজগুলিকে কেন লক করতে চান? বিল্ড প্রক্রিয়াটি তারা এটি তৈরি করতে ব্যবহার করে? এটি ডেভ নির্ভরতা হিসাবে যুক্ত করা তাদের এটিকে ডিকুয়াল করার অনুমতি দেয়। মূলত 2 টি পর্যায় রয়েছে: সময় এবং রান সময় তৈরি করুন। নির্মাণের সময় দেব নির্ভরতা প্রয়োজন। রানটাইম এ নিয়মিত এবং পিয়ার নির্ভরতা প্রয়োজন। অবশ্যই নির্ভরতার উপর নির্ভরশীলতার সাথে সবকিছু বিভ্রান্ত হয়ে ওঠে দ্রুত :)
স্টিজন ডি উইট

1
এই উত্তরের জন্য আপনাকে ধন্যবাদ! শুধু তোমার উদাহরণে নির্মল, যদি JacksModuleউপর নির্ভর করে JillsModule ^1.0.0দিয়ে JillsModuleএকটি পিয়ার নির্ভরতা হচ্ছে JacksModuleএবং YourCoolProjectব্যবহার করা হয়েছে JacksModuleএবং JillsModule ^2.0.0আমরা NPM দ্বারা পিয়ার নির্ভরতা সতর্কবার্তা, যা ইনস্টল করতে আমাদের পরামর্শ হবে পাবেন JillsModule ^1.0.0পাশাপাশি। তবে তখন কী হয়? YourCoolProjectএখন কি JillsModuleআমদানিযোগ্য দুটি সংস্করণ থাকবে import jillsModule from "..."? এবং আমি কীভাবে মনে রাখতে পারি যে আমি যখন ব্যবহার JacksModuleকরি তখন এটির একটি উদাহরণ পাস করা দরকার JillsModule v1.0.0?
টনিক্স

1
@ টোনিক্স ওয়েল, এটি আপনার কাছে ভার্সন বেমানান হওয়ার সমস্যাটি হবে। পিয়ারডেপেন্ডেন্সগুলি এর সমাধান করে না। তবে সমস্যাটি সুস্পষ্ট করতে সহায়তা করে। কারণ এটি নিঃশব্দে দুটি সংস্করণ ব্যবহার করার পরিবর্তে সংস্করণটি স্পষ্টতই মেলে না। অ্যাপ্লিকেশন বিকাশকারী যা গ্রন্থাগারগুলি নির্বাচন করছে তাদের একটি সমাধান খুঁজে পেতে হবে।
স্টিজন ডি উইট

2
@ টোনিক্স বা তৃতীয় বিকল্প: JacksModuleরেপো ক্লোন করুন , নির্ভর করে JillsModule ^2.0.0এবং প্রজেক্ট রক্ষণাবেক্ষণকারীকে একটি PR অফার করার জন্য এটি আপগ্রেড করুন । প্রথমে এই নির্ভরতা পুরানো এবং আপনি এটি আপডেট করতে সহায়তা করতে চাইলে প্রথমে বাগ জমা দিতে সহায়তা করতে পারে। আপনি যদি একটি ভাল জনসংযোগ তৈরি করেন তবে বেশিরভাগ গ্রন্থাগার রক্ষণাবেক্ষণকারীরা এটি একত্রীকরণ করবে এবং এর জন্য আপনাকে ধন্যবাদ জানাবে। যদি রক্ষণাবেক্ষণকারীরা প্রতিক্রিয়াহীন না হন তবে আপনি নিজের কাঁটাচামচটি আপনার নামে এনপিএম নেমস্পিডে প্রকাশ করতে পারেন এবং তার পরিবর্তে আপনার কাঁটাচামচ ব্যবহার করতে পারেন। যে কোনও উপায়ে সমাধান রয়েছে তবে peerDependenciesএটি নিজে থেকে সমাধান করে না।
স্টিজন ডি উইট

26

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

উদাহরণস্বরূপ, আসুন যে এটি তার বস্তুর মধ্যে winston-mail@0.2.3নির্দিষ্ট করা ভান কারণ এটি সর্বশেষতম সংস্করণ যার বিরুদ্ধে পরীক্ষা করা হয়েছিল। একটি অ্যাপ্লিকেশন বিকাশকারী হিসাবে আপনি সর্বশেষ এবং সর্বশ্রেষ্ঠ কাপড় চাই, যাতে আপনি এর সর্বশেষ সংস্করণ খোঁজা এবং তাদের হিসাবে আপনার package.json রাখা"winston": "0.5.x""dependencies"winstonwinston-mail

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

তবে এখন, এনপিএম ইনস্টল চলমান এর অপ্রত্যাশিত নির্ভরতা গ্রাফের ফলাফল

├── winston@0.6.2  
└─┬ winston-mail@0.2.3                
  └── winston@0.5.11

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

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

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


1
আপনি বলছেন multiple versions of a package which would cause some issuesকিন্তু এটি কোনও প্যাকেজ ম্যানেজারের পুরো পয়েন্ট নয়? এমনকি তারা আরও একই প্রবন্ধে আরও আলোচনা করেছেন যেখানে প্রকল্পে একই প্যাকেজের 2 সংস্করণ রয়েছে: একটি বিকাশকারী সরবরাহ করেছেন এবং একটি তৃতীয় পক্ষের লাইব্রেরি সরবরাহ করেছেন।
অ্যাডাম বেক

1
আমি মনে করি আমি পিয়ার নির্ভরতার বিষয়টি বুঝতে পারি তবে winstonউদাহরণটিতে আমি কি এখন winston-mailলাইব্রেরিটি ব্যবহার করতে পারছি না কারণ আমার সংস্করণটি পিয়ার নির্ভরতার সাথে মেলে না? আমি বরং এটি ব্যবহার করতে সক্ষম না হওয়ার চেয়ে 1 লাইব্রেরির জন্য সর্বশেষ থেকে সর্বকালের থেকে অস্থায়ী ডাউনগ্রেডটি চাই।
অ্যাডাম বেক

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

1
আপনার দ্বিতীয় মন্তব্যে: এই কারণেই তারা ডক্সে বলেছেন যে বিকাশকারীদের তাদের প্যাকেজ নির্ভরতাগুলির সাথে স্বচ্ছ হতে হবে এবং সেমভার ব্যবহার করা উচিত, যেমন "0.2.1", "~ 0.2.1" -> "0.2.x" এর অনুমতি দেয় তবে "0.3.x", বা "> = 0.2.1" -> "0.2.x" থেকে "1.x" বা "x.2" পর্যন্ত সমস্ত কিছুই। .. (তবে কোনও এনপিএম প্যাকেজের জন্য পছন্দনীয় নয় 9
ফের টু

15

peerDependencies সহজতম উদাহরণ দিয়ে ব্যাখ্যা করা হয়েছে:

{
  "name": "myPackage",
  "dependencies": {
    "foo": "^4.0.0",
    "react": "^15.0.0"
  }
}


{
  "name": "foo"
  "peerDependencies": {
    "react": "^16.0.0"
  }
}

মাইপ্যাকেজে এনপিএম ইনস্টল চালানো ত্রুটি ছুঁড়ে দেবে কারণ এটি প্রতিক্রিয়া সংস্করণ ইনস্টল করার চেষ্টা করছে ^15.0.0এবং fooএটি কেবল প্রতিক্রিয়াটির সাথে সামঞ্জস্যপূর্ণ ^16.0.0

পিয়ারডেপেন্ডেন্সগুলি ইনস্টল করা নেই।


কেন শুধু ফু এর অভ্যন্তরীণ হিসাবে 16 প্রতিক্রিয়া রাখেন? যেভাবে 15 এবং 16 উভয়ই অ্যাক্সেসযোগ্য হবে এবং ফু 16 এবং মাইপ্যাকেজ 15 ব্যবহার করতে পারে?
nitinsh99

প্রতিক্রিয়া হ'ল একটি কাঠামো যা রানটাইমের সময় বুটস্ট্র্যাপ করা হয়, একই পৃষ্ঠায় প্রতিক্রিয়া 15 এবং প্রতিক্রিয়া 16 উভয়ের জন্যই আপনাকে একইসাথে উভয়কেই বুস্ট্র্যাপ করতে হবে যা শেষ ব্যবহারকারীর জন্য অত্যন্ত ভারী এবং সমস্যাযুক্ত হবে। যদি fooপ্রতিক্রিয়া 15 এবং প্রতিক্রিয়া 16 উভয় নিয়ে কাজ করে তবে এটি তার পিয়ার নির্ভরতা তালিকাভুক্ত করতে পারে>=15 < 17
জেনস বোডাল

nitinsh99 আমার উত্তরটি ছিল পীর-নির্ভরতাগুলির উদ্দেশ্যটি সহজতম উদাহরণ দিয়ে ব্যাখ্যা করা, কীভাবে পিয়ার
ক্রিস্টোফার

@ নিতিনশ৯৯ প্যাকেজ নির্ভরতার অভ্যন্তরে প্রতিক্রিয়া যুক্ত হুক্সের মতো ইস্যু সরবরাহ করবে - একটি প্যাকেজে একাধিক প্রতিক্রিয়া
মাসউদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.