Npm package.json फ़ाइल में निर्भरता, अवमूल्यन और सहअनुभूति के बीच अंतर क्या है?


2026

यह दस्तावेज़ मेरे प्रश्न का बहुत खराब उत्तर देता है। मैं उन स्पष्टीकरणों को नहीं समझ पाया। क्या कोई सरल शब्दों में कह सकता है? शायद उदाहरणों के साथ अगर सरल शब्दों को चुनना मुश्किल है?

EDIT भी जोड़ा गया है peerDependencies, जो निकट से संबंधित है और भ्रम पैदा कर सकता है।


48
ध्यान दें optionalDependenciesअब भी हैं।
इदान फेल्डमैन

118
@AidanFeldman "ऑप्शनल डिपेंडेंसी" दिन का मेरा ऑक्सीमोरोन है
निक बुल

1
एनपीएम प्रलेखन कहता है: "निर्भरता": उत्पादन में आपके आवेदन के लिए आवश्यक पैकेज। "अवमूल्यन": वे पैकेज जो केवल स्थानीय विकास और परीक्षण के लिए आवश्यक हैं। लिंक देखें: docs.npmjs.com/…
Deke

जवाबों:


2359

महत्वपूर्ण व्यवहार अंतर का सारांश:

  • dependencies दोनों पर स्थापित हैं:

    • npm install जिसमें एक निर्देशिका शामिल है package.json
    • npm install $package किसी अन्य निर्देशिका पर
  • devDependencies इस प्रकार हैं:

    • जब तक आप ध्वज को पास नहीं करते npm installहैं package.json, तब तक एक निर्देशिका पर स्थापित किया जाता है --production( गायन चरिथ के उत्तर पर जाएं )।
    • npm install "$package"किसी अन्य निर्देशिका पर स्थापित नहीं है , जब तक कि आप इसे --devविकल्प नहीं देते हैं।
    • संक्रमणीय रूप से स्थापित नहीं हैं।
  • peerDependencies:

    • 3.0 से पहले: हमेशा लापता होने पर स्थापित होते हैं, और एक त्रुटि बढ़ाते हैं यदि निर्भरता के कई असंगत संस्करणों का उपयोग विभिन्न निर्भरताओं द्वारा किया जाएगा।
    • 3.0 पर शुरू होने की उम्मीद है (अप्रयुक्त): यदि लापता है npm install, तो एक चेतावनी दें और आपको स्वयं निर्भरता को स्वयं हल करना होगा। दौड़ते समय, यदि निर्भरता गायब है, तो आपको एक त्रुटि मिलती है ( @nextgentech द्वारा उल्लिखित )
  • संवेदनशीलता ( बेन हचिसन द्वारा उल्लिखित ):

    • dependencies संचरित रूप से स्थापित होते हैं: यदि A को B की आवश्यकता होती है, और B को C की आवश्यकता होती है, तो C स्थापित हो जाता है, अन्यथा, B काम नहीं कर सकता, और न ही A।

    • devDependenciesसंक्रमणीय रूप से स्थापित नहीं है। उदाहरण के लिए, हमें A को परीक्षण करने के लिए B का परीक्षण करने की आवश्यकता नहीं है, इसलिए B की परीक्षण निर्भरता को छोड़ा जा सकता है।

संबंधित विकल्पों पर यहां चर्चा नहीं की गई है:

devDependencies

dependenciesचलाने के लिए आवश्यक हैं, devDependenciesकेवल विकसित करने के लिए, उदाहरण के लिए: इकाई परीक्षण, कॉफीस्क्रिप्ट से जावास्क्रिप्ट ट्रांसप्लिकेशन, मिनिफिकेशन, ...

यदि आप एक पैकेज विकसित करने जा रहे हैं, तो आप इसे डाउनलोड करते हैं (जैसे के माध्यम से git clone), इसके रूट पर जाएं जिसमें सम्‍मिलित है package.json, और रन करें:

npm install

चूंकि आपके पास वास्तविक स्रोत है, इसलिए यह स्पष्ट है कि आप इसे विकसित करना चाहते हैं, इसलिए डिफ़ॉल्ट रूप से, दोनों dependencies(चूंकि आपको अवश्य, विकसित करने के लिए दौड़ना चाहिए) और devDependencyनिर्भरताएं भी स्थापित हैं।

यदि हां, तो आप केवल एक अंतिम उपयोगकर्ता हैं जो इसे उपयोग करने के लिए एक पैकेज स्थापित करना चाहते हैं, आप किसी भी निर्देशिका से करेंगे:

npm install "$package"

उस स्थिति में, आप आमतौर पर विकास निर्भरता नहीं चाहते हैं, इसलिए आपको पैकेज का उपयोग करने के लिए बस वही चाहिए जो dependencies:।

यदि आप वास्तव में उस स्थिति में विकास पैकेज स्थापित करना चाहते हैं, तो आप devकॉन्फ़िगरेशन विकल्प को trueसंभवतः कमांड लाइन से निम्नानुसार सेट कर सकते हैं :

npm install "$package" --dev

विकल्प falseडिफ़ॉल्ट रूप से है क्योंकि यह बहुत कम सामान्य मामला है।

peerDependencies

(3.0 से पहले परीक्षण किया गया)

स्रोत: https://nodejs.org/en/blog/npm/peer-d dependencies/

नियमित निर्भरता के साथ, आपके पास निर्भरता के कई संस्करण हो सकते हैं: यह बस node_modulesनिर्भरता के अंदर स्थापित है ।

जैसे अगर dependency1और dependency2दोनों dependency3अलग-अलग संस्करणों पर निर्भर करते हैं तो प्रोजेक्ट ट्री जैसा दिखेगा:

root/node_modules/
                 |
                 +- dependency1/node_modules/
                 |                          |
                 |                          +- dependency3 v1.0/
                 |
                 |
                 +- dependency2/node_modules/
                                            |
                                            +- dependency3 v2.0/

प्लगइन्स, हालांकि, ऐसे पैकेज होते हैं जिन्हें आमतौर पर दूसरे पैकेज की आवश्यकता नहीं होती है, जिसे इस संदर्भ में होस्ट कहा जाता है। बजाय:

  • मेजबान द्वारा प्लगइन्स की आवश्यकता है
  • प्लगइन्स एक मानक इंटरफ़ेस प्रदान करते हैं जो होस्ट खोजने की अपेक्षा करता है
  • केवल होस्ट को सीधे उपयोगकर्ता द्वारा बुलाया जाएगा, इसलिए इसका एक ही संस्करण होना चाहिए।

जैसे अगर dependency1और dependency2सहकर्मी पर निर्भर करते हैं dependency3, तो प्रोजेक्ट ट्री जैसा दिखेगा:

root/node_modules/
                 |
                 +- dependency1/
                 |
                 +- dependency2/
                 |
                 +- dependency3 v1.0/

ऐसा तब भी होता है जब आप dependency3अपनी package.jsonफाइल में कभी उल्लेख नहीं करते हैं।

मुझे लगता है कि यह कंट्रोल डिजाइन पैटर्न के व्युत्क्रम का एक उदाहरण है ।

सहकर्मी निर्भरता का एक प्रोटोटाइप उदाहरण ग्रंट, होस्ट और उसके प्लगइन्स हैं।

उदाहरण के लिए, https://github.com/gruntjs/grunt-contrib-uglify जैसे ग्रंट प्लगइन पर , आप देखेंगे कि:

  • grunt एक है peer-dependency
  • एकमात्र require('grunt')के तहत है tests/: यह वास्तव में कार्यक्रम द्वारा उपयोग नहीं किया जाता है।

फिर, जब उपयोगकर्ता एक प्लगइन का उपयोग करेगा, तो वह संक्षेप में Gruntfileएक grunt.loadNpmTasks('grunt-contrib-uglify')पंक्ति जोड़कर प्लगइन की आवश्यकता होगी , लेकिन यह है gruntकि उपयोगकर्ता सीधे कॉल करेगा।

यह तब काम नहीं करेगा जब प्रत्येक प्लगइन को एक अलग ग्रंट संस्करण की आवश्यकता हो।

गाइड

मुझे लगता है कि दस्तावेज़ीकरण इस सवाल का बहुत अच्छी तरह से जवाब देता है, शायद आप नोड / अन्य पैकेज प्रबंधकों के साथ पर्याप्त रूप से परिचित नहीं हैं। मैं शायद केवल इसे समझता हूं क्योंकि मैं रूबी बंडल के बारे में थोड़ा जानता हूं।

मुख्य पंक्ति यह है:

Npm लिंक या npm को पैकेज के रूट से इंस्टॉल करते समय इन चीजों को इंस्टॉल किया जाएगा और इसे किसी भी अन्य npm कॉन्फ़िगरेशन पैरामीटर की तरह प्रबंधित किया जा सकता है। विषय पर अधिक के लिए npm-config (7) देखें।

और फिर npm-config (7) के तहत खोजें dev:

Default: false
Type: Boolean

Install dev-dependencies along with packages.

5
आह। मुझे लगता है मैं गलत समझा है। आपका उत्तर यह पढ़ता है जैसे कि npm install packageएक कमांड है जिसका उपयोग आप उन सभी पैकेजों को स्थापित करने के लिए करेंगे जो कि देव निर्भरता नहीं हैं, बजाय इसके कि मैं अब आपको लगता है कि इसका मतलब था, जो 'पैकेज [पैकेज] नामक स्थापित था, जो कि मैंने सोचा था कि यह कैसे काम करता है इसे पढ़ने से पहले। यदि मैं ऐसा होता तो मैं [पैकेज-नाम] कहने के लिए संपादित होता, जो स्पष्ट रूप से दिखाता है कि आपका मतलब 'इन्सर्ट-नेम' है।
टॉम डब्ल्यू

184
यह भी खूब रही! मुझे कभी एहसास नहीं हुआ, लेकिन इस जवाब ने मुझे सिखाया है कि निर्भरता बनाम भक्ति पर निर्भरता अंतर केवल तभी लागू होता है जब आप एक npm पैकेज प्रकाशित करने जा रहे हों। यदि आप किसी एप्लिकेशन या साइट पर काम कर रहे हैं, तो यह बहुत ज्यादा मायने नहीं रखता। धन्यवाद!
jedd.ahyoung

3
इस पोस्ट को peerDependenciesआगामी npm @ 3 में परिवर्तित व्यवहार को प्रतिबिंबित करने के लिए अपडेट किया जाना चाहिए । से blog.npmjs.org/post/110924823920/npm-weekly-5 :। "हम स्वचालित रूप से अब और सहकर्मी निर्भरता को डाउनलोड नहीं किया जाएगा इसके बजाय, हम आपको चेतावनी देंगे सहकर्मी निर्भरता पहले से ही स्थापित नहीं है, तो यह आपको आवश्यकता है। सहकर्मी निर्भरता को हल करने के लिए अपने आप को, मैन्युअल रूप से संघर्ष करता है, लेकिन लंबे समय में यह कम संभावना है कि आप अपने संकुल की निर्भरता के साथ एक मुश्किल जगह में समाप्त हो जाएगा करना चाहिए। "
नेक्स्टजेनटेक

8
इसके अलावा, भरोसेमंद पैकेजों पर निर्भरता से परिवर्तन नहीं किया जाता है। उदाहरण: पैकेज ए पैकेज बी पर निर्भर करता है। पैकेज बी पैकेज सी पर निर्भर करता है, और बी पैकेज डी पर भी निर्भर करता है। यदि आप npm installपैकेज ए से चलाते हैं , तो आपको बी और सी नहीं बल्कि डी मिलेगा
बेन हचिसन

9
यह टिप्पणी करना महत्वपूर्ण है कि devDependenciesकब NODE_ENVसेट किया गया है production
अगस्तो फ्रेंज़ोया

490

यदि आप ऐसी निर्भरताएँ स्थापित नहीं करना चाहते हैं जिनका आप उपयोग कर सकते हैं npm install --production


1
npm स्थापित - सॉफ्टवेयर की निर्भरता के लिए save है?
वामसी पावन महेश

19
npm स्थापित सभी निर्भरताएँ स्थापित करेगा। - save ध्वज का उपयोग तब किया जाता है जब आप विशिष्ट मॉड्यूल को package.json में जोड़ना चाहते हैं। ex: - npm स्थापित करें uglify --save आपके प्रोजेक्ट फ़ोल्डर में uglify स्थापित करेगा और uglify को प्रोजेक्ट, package.json फ़ाइल में जोड़ेगा।
गायन चरित

6
और क्योंकि हम देव-निर्भरता की बात कर रहे हैं, आप नए मॉड्यूल को एक देव-निर्भरता के रूप में सहेजने के लिए उपयोग कर सकते हैं। उदाहरण: npm स्थापित करें uglify --save-dev
Mykaelos

9
Npm 5 के रूप में, --saveविकल्प अब आवश्यक नहीं है। यदि आप "npm माय-पैकेज इंस्टॉल करते हैं", तो यह आपकी package.jsonफाइल में एक निर्भरता के रूप में मेरा पैकेज जोड़ देगा ।
मार्टिन केरेल

बस npm स्थापित
सुल्तान असलम

116

एक उदाहरण के रूप में, मोचा सामान्य रूप से एक निर्भरता होगी, क्योंकि परीक्षण उत्पादन में आवश्यक नहीं है, जबकि एक्सप्रेस एक निर्भरता होगी।


4
मैं निर्भरता के रूप में परीक्षण डालने की दिशा में

47
मैं इसके बजाय हडसन या सर्किलसी जैसी एक निरंतर एकीकरण सेवा का उपयोग करने की सिफारिश करूंगा जो आपके परीक्षण चलाता है और फिर उत्पादन के लिए तैनात करता है यदि वे पास होते हैं।
डैन कोन

1
यह वास्तविक सर्वर का परीक्षण करने के लिए अभी भी प्रासंगिक हो सकता है क्योंकि CI सर्वर किसी भी तरह से सर्वर से अलग हो सकता है, और यह अंतर उदा ऐप को शुरू होने से रोक सकता है ...
निकोल

2
@ नोकोल क्यों आप अपने मंचन सर्वर को अपने उत्पादों के विन्यास में समान नहीं बनायेंगे?
लुकास

1
फिर से, नियमित निर्भरता के रूप में परीक्षण निर्भरता को जोड़ने से अतिरिक्त पुस्तकालयों की एक पूरी गुच्छा का परिचय होता है, जिनमें से प्रत्येक किसी तरह से विफल हो सकता है। मैं लाइट-वेट प्रोडक्शन सर्वरों की ओर कम से कम उन पर जितना संभव हो उतना कोड लगाऊंगा। याद रखें, सबसे अच्छा कोड कोई कोड नहीं है!
स्टिजन डे विट

69

निर्भरता
निर्भरता अपनी परियोजना में एक पुस्तकालय है कि कार्यों है कि आप अपने कोड से फोन प्रदान करता है की तरह चलाने के लिए, की जरूरत है।
वे संक्रमणीय रूप से स्थापित होते हैं (यदि A B पर निर्भर करता है C पर निर्भर करता है, A पर npm स्थापित B और C को स्थापित करेगा)।
उदाहरण: लॉश: आपकी परियोजना कुछ लॉश कार्यों को बुलाती है।

विकास
निर्भरताएँ आपको केवल विकास या विमोचन के दौरान चाहिए, जैसे संकलक जो आपका कोड लेते हैं और इसे जावास्क्रिप्ट, परीक्षण रूपरेखा या प्रलेखन जनरेटर में संकलित करते हैं।
वे संक्रमणीय रूप से स्थापित नहीं होते हैं (यदि ए, बी देव पर निर्भर करता है-सी पर निर्भर करता है, ए पर एनपीएम स्थापित केवल बी स्थापित करेगा)।
उदाहरण: ग्रन्ट: आपकी परियोजना ग्रंट का उपयोग स्वयं के निर्माण के लिए करती है।

सहकर्मी
निर्भरताएं जो आपकी परियोजना को हुक करती हैं, या मूल परियोजना में संशोधित करती हैं, आमतौर पर कुछ अन्य पुस्तकालय या उपकरण के लिए एक प्लगइन। यह सिर्फ एक चेक होने का इरादा है, यह सुनिश्चित करते हुए कि मूल परियोजना (परियोजना जो आपके प्रोजेक्ट पर निर्भर करेगी) में उस परियोजना पर निर्भरता है जिसे आप हुक करते हैं। इसलिए यदि आप एक प्लगइन C बनाते हैं जो लाइब्रेरी B के लिए कार्यक्षमता जोड़ता है, तो किसी प्रोजेक्ट A को बनाने वाले किसी व्यक्ति को B पर निर्भरता रखने की आवश्यकता होगी यदि वे C. पर निर्भरता रखते हैं।
वे स्थापित नहीं हैं (जब तक npm <3), वे केवल के लिए जाँच की।
उदाहरण: ग्रंट: आपका प्रोजेक्ट ग्रंट के लिए कार्यक्षमता जोड़ता है और केवल उन प्रोजेक्ट्स पर उपयोग किया जा सकता है जो ग्रंट का उपयोग करते हैं।

यह प्रलेखन वास्तव में अच्छी तरह से सहकर्मी निर्भरता की व्याख्या करता है: https://nodejs.org/en/blog/npm/peer-dependiction/

इसके अलावा, समय के साथ npm के प्रलेखन में सुधार हुआ है, और अब विभिन्न प्रकार की निर्भरताओं के बेहतर स्पष्टीकरण हैं: https://github.com/npm/cli/blob/latest/doc/files/package.json.d#devd dependencies


63

एक पैकेज को बचाने के लिए package.json को dev. निर्भरता के रूप में :

npm install "$package" --save-dev

जब आप npm installइसे चलाते हैं तो यह दोनों devDependenciesऔर स्थापित हो जाएगा dependencies। इंस्टॉल devDependenciesरन से बचने के लिए:

npm install --production

3
आप यह भी उपयोग कर सकते हैं:
npm

36

कुछ मॉड्यूल और पैकेज केवल विकास के लिए आवश्यक हैं, जिनकी उत्पादन में आवश्यकता नहीं है। जैसा कि यह प्रलेखन में यह कहते हैं :

यदि कोई अपने प्रोग्राम में आपके मॉड्यूल को डाउनलोड करने और उसका उपयोग करने की योजना बना रहा है, तो वे शायद बाहरी परीक्षण या प्रलेखन फ्रेमवर्क को डाउनलोड या बनाने की आवश्यकता नहीं है जो आप उपयोग करते हैं। इस मामले में, इन अतिरिक्त वस्तुओं को देव-निर्भरता हैश में सूचीबद्ध करना सबसे अच्छा है।


यदि आप उत्पादन पर केवल बंडल.जेएस फ़ाइल चला रहे हैं तो क्या होगा? क्या आपको वास्तव में उन निर्भरताओं की आवश्यकता है?
रेगरॉय

यदि आप सर्वर पर bundle.js चला रहे हैं, तो आप सर्वर-साइड वेबपैक या कुछ और कर रहे हैं ... कृपया जांचें कि क्या मामला है क्योंकि यह आमतौर पर नहीं है और यह वास्तव में बहुत काम लेता है ताकि सही ढंग से चल सके (I पता है क्योंकि मैंने ऐसा किया है)। मुझे संदेह है कि आपके बंडल.जेएस को केवल ब्राउज़र तक ही परोसा जाता है और इसमें क्लाइंट-साइड कोड होता है।
टिजिन डे विट

16

एक सरल व्याख्या जिसने इसे मेरे लिए और अधिक स्पष्ट कर दिया है:

जब आप अपने ऐप को तैनात करते हैं, तो निर्भरता में मॉड्यूल स्थापित करने की आवश्यकता होती है या आपका ऐप काम नहीं करेगा। जब से आप उस मशीन पर विकसित नहीं हो रहे हैं, तब तक डिडबिलिटी में मॉड्यूल उत्पादन सर्वर पर स्थापित करने की आवश्यकता नहीं है। संपर्क


2
इसलिए, अगर हम वेबसाइट बना रहे हैं और प्रोडक्ट वर्जन में सभी लिबल्स इनबिल्ट हो जाएंगे vendor.js, तो हमारे सभी डिप्स देव डिप्स होने चाहिए, अगर कंपाइल कोड को रेपो में कमिट किया जाए? और इसे कमिट किया जाना चाहिए, क्योंकि अन्य विचित्र यह अजीब है कि आपको मॉड्यूल संकलित करना है, न कि केवल इसे इंस्टॉल करना है (और परीक्षण भी कहीं न कहीं है क्योंकि
सबमॉड्यूल्स

बहुत बढ़िया जवाब, लेकिन एक सवाल है? क्या वेबपैक एक दूषित बंडल का निर्माण करता है? मेरा अनुमान है कि निर्भरता के पैकेज उत्पाद संस्करण में काम नहीं करेंगे, webpack -pमेरा मतलब है। कृपया मेरे प्रश्न का उत्तर दें।
AmerllicA

यदि निर्माण करते समय कोई समस्या है, तो आपकी परिनियोजन प्रक्रिया को इस तरह से डिज़ाइन किया जाना चाहिए कि यह निर्माण के समय त्रुटि दिखाती है और दूषित कोड को उत्पादन में नहीं धकेलती है (जैसे कि आप जेनकिंस की कोशिश कर सकते हैं)। उत्पादन सर्वर पर किसी भी तरह की निर्भरता की आवश्यकता नहीं है।
ज्योति दूहन

और सहकर्मी निर्भरता के बारे में क्या?
dev27

13

मैं इन निर्भरता स्पष्टीकरण पर अपने विचार के उत्तर में जोड़ना चाहूंगा

  • dependencies आपके कोडबेस में प्रत्यक्ष उपयोग के लिए उपयोग किया जाता है, चीजें जो आमतौर पर उत्पादन कोड में समाप्त होती हैं, या कोड का हिस्सा होता है
  • devDependencies निर्माण प्रक्रिया के लिए उपयोग किया जाता है, उपकरण जो आपको यह प्रबंधित करने में सहायता करते हैं कि अंतिम कोड कैसे समाप्त होगा, तृतीय पक्ष परीक्षण मॉड्यूल, (फास्ट वेबपैक सामान)।

सीएसएस संपत्ति के बारे में क्या?
बजे ब्रायन ज़ेलिप

8

संक्षेप में

  1. निर्भरताएं - npm install <package> --save-prodउत्पादन वातावरण में आपके आवेदन के लिए आवश्यक पैकेज स्थापित करता है।

  2. निर्भरता - npm install <package> --save-devकेवल स्थानीय विकास और परीक्षण के लिए आवश्यक संकुल स्थापित करता है

  3. केवल टाइपिंग npm installपैकेज.जॉन में उल्लिखित सभी पैकेजों को स्थापित करती है

इसलिए यदि आप अपने स्थानीय कंप्यूटर पर काम कर रहे हैं तो बस टाइप करें npm installऔर जारी रखें :)


6

peerDependenciesमेरे लिए तब तक काफी समझ में नहीं आया जब तक कि मैं ऊपर उल्लिखित विषय Ciro पर एक ब्लॉग पोस्ट से इस स्निपेट को नहीं पढ़ता :

क्या जरूरत [ प्लगइन्स ] प्लगइन्स और उनके मेजबान पैकेज के बीच इन "निर्भरता" व्यक्त करने का एक तरीका है। कहने का कुछ तरीका, "मैं केवल तब काम करता हूं जब मेरे होस्ट पैकेज के संस्करण 1.2.x पर प्लग किया जाता है, इसलिए यदि आप मुझे स्थापित करते हैं, तो सुनिश्चित करें कि यह एक सुसंगत होस्ट के साथ है।" हम इस रिश्ते को एक सहकर्मी निर्भरता कहते हैं।

प्लगइन मेजबान के एक विशिष्ट संस्करण की उम्मीद करता है ...

peerDependenciesप्लगइन्स के लिए हैं, पुस्तकालयों को अपना कार्य करने के लिए "होस्ट" लाइब्रेरी की आवश्यकता होती है, लेकिन होस्ट के नवीनतम संस्करण को रिलीज़ होने से पहले एक समय में लिखा जा सकता है ।

यही कारण है, अगर मैं लिखने PluginX v1के लिए HostLibraryX v3और चले, वहाँ कोई गारंटी नहीं है PluginX v1जब काम करेंगे HostLibraryX v4(या यहाँ तकHostLibraryX v3.0.1 ) जारी किया गया है।

... लेकिन प्लगइन निर्भर नहीं करता है मेजबान पर करता है ...

प्लगइन के दृष्टिकोण से, यह केवल होस्ट लाइब्रेरी में फ़ंक्शन जोड़ता है । मुझे प्लगइन पर निर्भरता जोड़ने के लिए होस्ट की वास्तव में "आवश्यकता" नहीं है, और प्लगइन्स अक्सर अपने मेजबान पर निर्भर नहीं होते हैं । यदि आपके पास होस्ट नहीं है, तो प्लगइन हानिरहित कुछ भी नहीं करता है।

इसका मतलब dependenciesहै कि वास्तव में प्लगइन्स के लिए सही अवधारणा नहीं है।

इससे भी बदतर, अगर मेरे मेजबान को एक निर्भरता की तरह माना जाता था, तो हम इस स्थिति में समाप्त हो जाएंगे कि एक ही ब्लॉग पोस्ट का उल्लेख है (इस उत्तर होस्ट और प्लगइन का उपयोग करने के लिए थोड़ा संपादित किया गया है):

लेकिन अब, [यदि हम HostLibraryX के समकालीन संस्करण को PluginX के लिए एक निर्भरता के रूप में मानते हैं,] npm installतो अनपेक्षित निर्भरता ग्राफ में परिणाम चल रहे हैं

├── HostLibraryX@4.0.0
└─┬ PluginX@1.0.0
  └── HostLibraryX@3.0.0

मैं आपकी कल्पना के मुख्य अनुप्रयोग की तुलना में एक अलग [HostLibraryX] API का उपयोग करके आने वाली सूक्ष्म विफलताओं को छोड़ दूँगा।

... और मेजबान स्पष्ट रूप से प्लगइन पर निर्भर नहीं करता है ...

... यह प्लगइन्स का पूरा बिंदु है। अब यदि होस्ट अपने सभी प्लगइन्स के लिए निर्भरता की जानकारी को शामिल करने के लिए काफी अच्छा था , जो समस्या को हल करेगा, लेकिन यह एक बड़ी नई सांस्कृतिक समस्या भी पेश करेगा : प्लगइन प्रबंधन!

प्लगइन्स की पूरी बात यह है कि वे गुमनाम रूप से जोड़ सकते हैं। एक आदर्श दुनिया में, मेजबान प्रबंधन उन्हें सब साफ सुथरा होगा, लेकिन हम पुस्तकालयों झुंड बिल्लियों की आवश्यकता नहीं जा रहे हैं।

यदि हम पदानुक्रमिक रूप से निर्भर नहीं हैं, तो शायद हम अंतर्मुखी सहकर्मी हैं ...

इसके बजाय, हमारे पास सहकर्मी होने की अवधारणा है। अन्य की निर्भरता बाल्टी में न तो होस्ट और न ही प्लगइन बैठता है। दोनों निर्भरता ग्राफ के समान स्तर पर रहते हैं।


... लेकिन यह एक स्वचालित संबंध नहीं है। <<< मनीबॉल !!!

अगर मैं कर रहा हूँ PluginX v1और उम्मीद की एक सहकर्मी (यह है कि, के एक peerDependency है ) HostLibraryX v3, मैं इतना कहूँगा। आप नवीनतम करने के लिए स्वचालित रूप से अपग्रेड गया है HostLibraryX v4(ध्यान दें कि के संस्करण 4 ) और है Plugin v1स्थापित है, तो आप को पता होगा, की जरूरत है?

npm मेरे लिए इस स्थिति का प्रबंधन नहीं कर सकते -

"अरे, मैं देख PluginX v1रहा हूँ कि आप उपयोग कर रहे हैं ! मैं स्वचालित रूप HostLibraryXसे v4 से v3, kk में अपग्रेड कर रहा हूँ! "

... और ...

"अरे मैं देख रहा हूं कि आप उपयोग कर रहे हैं PluginX v1। यह अपेक्षा है HostLibraryX v3, जिसे आपने अपने अंतिम अपडेट के दौरान धूल में छोड़ दिया है। सुरक्षित होने के लिए, मैं स्वचालित रूप से सेटिंग कर रहा हूं Plugin v1!! 1

कैसे नहीं, npm के बारे में ?!

तो npm नहीं है। यह आपको स्थिति के लिए सचेत करता है, और आपको यह पता लगाने देता है कि क्या इसके HostLibraryX v4लिए उपयुक्त सहकर्मी है Plugin v1


कोडा

peerDependencyप्लगइन्स में अच्छा प्रबंधन इस अवधारणा को व्यवहार में अधिक सहज रूप से काम करेगा। से ब्लॉग पोस्ट , एक बार फिर ...

सलाह का एक टुकड़ा: सहकर्मी निर्भरता आवश्यकताओं, नियमित निर्भरता के लिए उन लोगों के विपरीत, उदार होना चाहिए। आपको अपने सहकर्मी निर्भरता को विशिष्ट पैच संस्करणों में बंद नहीं करना चाहिए। यह वास्तव में कष्टप्रद होगा अगर एक ची प्लगइन 1.4.1 पर सहकर्मी पर निर्भर है, जबकि एक और 1.5 ची पर निर्भर है, सिर्फ इसलिए कि लेखक आलसी थे और चाई के वास्तविक न्यूनतम संस्करण का पता लगाने में समय व्यतीत नहीं करते थे जो वे हैं के साथ संगत।


4

निर्भरता बनाम देव निर्भरता

देव निर्भरता ऐसे मॉड्यूल हैं जो केवल विकास के दौरान आवश्यक हैं जबकि रनटाइम पर निर्भरता की आवश्यकता होती है। यदि आप अपने एप्लिकेशन को तैनात कर रहे हैं, तो निर्भरताएं स्थापित करनी होंगी, अन्यथा आपका ऐप केवल काम नहीं करेगा। लायब्रेरी जिसे आप अपने कोड से कॉल करते हैं जो प्रोग्राम को चलाने में सक्षम बनाता है उसे निर्भरता माना जा सकता है।

जैसे- रिएक्ट, रिएक्ट - डोम

देव निर्भरता मॉड्यूल को उत्पादन सर्वर में स्थापित करने की आवश्यकता नहीं है क्योंकि आप उस मशीन में विकसित नहीं होने वाले हैं। माइक्रोमैक्स जो आपके कोड को जावास्क्रिप्ट, टेस्ट फ्रेमवर्क और दस्तावेज़ जनरेटर को कवर करता है, उन्हें देव-निर्भरता के रूप में माना जा सकता है क्योंकि वे केवल विकास के लिए आवश्यक हैं।

जैसे- ESLint, बैबल, वेबपैक

@FYI,

mod-a
  dev-dependents:
    - mod-b
  dependents:
    - mod-c

mod-d
  dev-dependents:
    - mod-e
  dependents:
    - mod-a

----

npm install mod-d

installed modules:
  - mod-d
  - mod-a
  - mod-c

----

checkout the mod-d code repository

npm install

installed modules:
  - mod-a
  - mod-c
  - mod-e

यदि आप npm पर प्रकाशित कर रहे हैं, तो यह महत्वपूर्ण है कि आप सही मॉड्यूल के लिए सही ध्वज का उपयोग करें। यदि यह ऐसा कुछ है जिसे आपके npm मॉड्यूल को कार्य करने की आवश्यकता है, तो मॉड्यूल को एक निर्भरता के रूप में सहेजने के लिए "--save" ध्वज का उपयोग करें। यदि यह ऐसा कुछ है जिसे आपके मॉड्यूल को कार्य करने की आवश्यकता नहीं है, लेकिन परीक्षण के लिए इसकी आवश्यकता है, तो "--save-dev" ध्वज का उपयोग करें।

# For dependent modules
npm install dependent-module --save

# For dev-dependent modules
npm install development-module --save-dev

1

एनपीएम पैकेज वितरित करने का प्रयास करते समय आपको उपयोग करने से बचना चाहिए dependencies। इसके बजाय आपको इसे जोड़ने peerDependenciesया इससे हटाने पर विचार करने की आवश्यकता है dependencies


1

मुझे एक साधारण स्पष्टीकरण मिला।

संक्षिप्त जवाब:

निर्भरता "... वे हैं जो आपकी परियोजना को वास्तव में उत्पादन में काम करने में सक्षम होने की आवश्यकता है।"

विकास पर निर्भरता "... वे हैं जो आपको विकास के दौरान चाहिए।"

सहकर्मी निर्भरता "यदि आप अपनी खुद की लाइब्रेरी बनाना और प्रकाशित करना चाहते हैं ताकि इसका उपयोग निर्भरता के रूप में किया जा सके"

इस पोस्ट में अधिक विवरण: https://code-trotter.com/web/dependencies-vs-devdependencies-vs-peerdependencies

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.