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
विकल्प न दें। - पारगमन से स्थापित नहीं हैं।
-
- 3.0 से पहले: यदि अनुपलब्ध हो तो हमेशा इंस्टॉल किया जाता है, और निर्भरता के एकाधिक असंगत संस्करणों का उपयोग विभिन्न निर्भरताओं द्वारा किया जाएगा, तो एक त्रुटि उत्पन्न करें।
- 3.0 (अनचाहे) से शुरू होने की उम्मीद है : अगर
npm install
पर लापता हो तो चेतावनी दें, और आपको निर्भरता को मैन्युअल रूप से हल करना होगा। चलते समय, यदि निर्भरता गुम होती है, तो आपको एक त्रुटि मिलती है ( @nextgentech द्वारा @nextgentech )
पारगमन ( बेन हचिसन द्वारा उल्लिखित):
dependencies
को पारगमन से स्थापित किया जाता है: यदि ए को बी की आवश्यकता होती है, और बी को सी की आवश्यकता होती है, तो सी स्थापित हो जाता है, अन्यथा बी काम नहीं कर सका, और न ही ए।devDependencies
transitively स्थापित नहीं हैं। उदाहरण के लिए हमें बी का परीक्षण करने की आवश्यकता नहीं है, इसलिए बी की परीक्षण निर्भरताओं को छोड़ दिया जा सकता है।
संबंधित विकल्पों पर चर्चा नहीं की गई:
-
bundledDependencies
पर निर्भरता जिन पर निम्नलिखित प्रश्नों पर चर्चा की गई है: एनपीएम में सामान्य निर्भरताओं पर बंडल निर्भरता के लाभ -
optionalDependencies
निर्भरता ( एडन फेलमैन द्वारा उल्लिखित)
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