node.js - Npm package.json फ़ाइल में निर्भरता, devDependencies और peerDependencies के बीच क्या अंतर है?




(6)

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


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


एक साधारण स्पष्टीकरण जिसने मुझे और अधिक स्पष्ट किया है:

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


महत्वपूर्ण व्यवहार मतभेदों का सारांश:

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

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

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

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

    • dependencies को पारगमन से स्थापित किया जाता है: यदि ए को बी की आवश्यकता होती है, और बी को सी की आवश्यकता होती है, तो सी स्थापित हो जाता है, अन्यथा बी काम नहीं कर सका, और न ही ए।

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

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

devDependencies

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

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

npm install

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

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

npm install "$package"

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

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

npm install "$package" --dev

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

peerDependencies

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

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

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

उदाहरण के लिए यदि dependency1 और dependency2 दोनों अलग-अलग संस्करणों पर dependency3 पर dependency3 करते हैं तो प्रोजेक्ट पेड़ इस तरह दिखेगा:

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

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

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

उदाहरण के लिए यदि dependency1 और dependency2 सहकर्मी dependency2 पर dependency3 , तो परियोजना का पेड़ इस तरह दिखेगा:

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

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

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

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

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

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

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

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

गाइड

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

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

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

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

Default: false
Type: Boolean

Install dev-dependencies along with packages.

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

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

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

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


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

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

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

यह दस्तावेज सहकर्मी निर्भरताओं को वास्तव में अच्छी तरह बताता है: https://nodejs.org/en/blog/npm/peer-dependencies/

साथ ही, समय के साथ एनपीएम दस्तावेज में सुधार हुआ है, और अब विभिन्न प्रकार की निर्भरताओं के बेहतर स्पष्टीकरण हैं: https://github.com/npm/npm/blob/master/doc/files/package.json.md#devdependencies







npm