महत्वपूर्ण व्यवहार अंतर का सारांश:
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.
optionalDependenciesअब भी हैं।