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