"Npm इंस्टॉल" और "npm ci" में क्या अंतर है?


215

मैं निरंतर एकीकरण के साथ काम कर रहा हूं और npm ci कमांड की खोज की है ।

मैं यह नहीं समझ सकता कि मेरे वर्कफ़्लो के लिए इस कमांड का उपयोग करने के क्या फायदे हैं।

क्या यह तेज है? क्या यह परीक्षा को कठिन बनाता है, ठीक है, और बाद में?

जवाबों:


327

से NPM डॉक्स :

संक्षेप में, npm स्थापित और npm ci का उपयोग करने के बीच मुख्य अंतर हैं:

  • परियोजना में एक मौजूदा पैकेज-लॉक.जॉन या एनपीएम-सिक्योरव्रेप.जॉन होना चाहिए।
  • यदि पैकेज लॉक की निर्भरता पैकेज में उन लोगों से मेल नहीं खाती है। पैकेज लॉक को अपडेट करने के बजाय, npm ci एक त्रुटि के साथ बाहर निकल जाएगा।
  • npm ci एक समय में केवल संपूर्ण प्रोजेक्ट स्थापित कर सकता है: इस निर्भरता के साथ व्यक्तिगत निर्भरता नहीं जोड़ी जा सकती है।
  • यदि एक नोड_मॉड्यूल्स पहले से मौजूद है, तो यह एनपीएमआई स्थापित होने से पहले स्वचालित रूप से हटा दिया जाएगा।
  • यह कभी भी package.json या किसी भी पैकेज-ताले को नहीं लिखेगा: इंस्टॉल अनिवार्य रूप से जमे हुए हैं।

अनिवार्य रूप से, निर्भरता की एक सूची बनाने के लिए npm installपढ़ता package.jsonहै और package-lock.jsonइन निर्भरता के कौन से संस्करण को स्थापित करने के लिए सूचित करने के लिए उपयोग करता है। अगर इसमें निर्भरता नहीं है, तो package-lock.jsonइसे जोड़ दिया जाएगाnpm install

npm ci( सी ontinuous I ntegration के नाम पर) सीधे निर्भरता स्थापित करता है package-lock.jsonऔर package.jsonकेवल यह पुष्टि करने के लिए उपयोग करता है कि कोई बेमेल संस्करण नहीं हैं। यदि कोई निर्भरता गायब है या असंगत संस्करण हैं, तो यह एक त्रुटि फेंक देगा

npm installएक परियोजना पर नई निर्भरता जोड़ने के लिए और निर्भरता को अपडेट करने के लिए उपयोग करें । आमतौर पर, आप विकास के दौरान इसका उपयोग उन परिवर्तनों को खींचने के बाद करते हैं जो निर्भरता की सूची को अपडेट करते हैं लेकिन npm ciइस मामले में उपयोग करना एक अच्छा विचार हो सकता है ।

npm ciयदि आपको एक निर्धारक, दोहराने योग्य निर्माण की आवश्यकता है, तो उपयोग करें । उदाहरण के लिए, निरंतर एकीकरण, स्वचालित नौकरियों आदि के दौरान और इसके बजाय पहली बार निर्भरता स्थापित करते समय npm install

npm install

  • एक पैकेज और उसके सभी आश्रितों को स्थापित करता है।
  • निर्भरता से प्रेरित हैं npm-shrinkwrap.jsonऔर package-lock.json(इसी क्रम में)।
  • बिना तर्क : एक स्थानीय मॉड्यूल की निर्भरता स्थापित करता है।
  • वैश्विक पैकेज स्थापित कर सकते हैं।
  • में कोई गुम निर्भरता स्थापित करेगा node_modules
  • यह package.jsonया को लिख सकते हैं package-lock.json
    • जब एक तर्क के साथ प्रयोग किया जाता है ( npm i packagename) यह package.jsonनिर्भरता को जोड़ने या अपडेट करने के लिए लिख सकता है ।
    • जब तर्क के बिना उपयोग किया जाता है, ( npm i) यह package-lock.jsonकुछ निर्भरता के संस्करण को बंद करने के लिए लिख सकता है यदि वे पहले से ही इस फ़ाइल में नहीं हैं।

npm ci

  • कम से कम npm v5.7.1 की आवश्यकता है
  • आवश्यकता है package-lock.jsonया npm-shrinkwrap.jsonउपस्थित होने की।
  • यदि इन दो फ़ाइलों से निर्भरता मेल नहीं खाती हैं, तो एक त्रुटि फेंकता है package.json
  • एक बार में सभी निर्भरता को निकालता है node_modulesऔर स्थापित करता है
  • यह करने के लिए लिखते हैं कभी नहीं package.jsonया package-lock.json

कलन विधि

जबकि npm ciसंपूर्ण निर्भरता ट्री से उत्पन्न होता है , package-lock.jsonया निम्न एल्गोरिथम ( स्रोत ) का उपयोग करने की सामग्री को अपडेट करता है :npm-shrinkwrap.jsonnpm install node_modules

load the existing node_modules tree from disk
clone the tree
fetch the package.json and assorted metadata and add it to the clone
walk the clone and add any missing dependencies
  dependencies will be added as close to the top as is possible
  without breaking any other modules
compare the original tree with the cloned tree and make a list of
actions to take to convert one to the other
execute all of the actions, deepest first
  kinds of actions are install, update, remove and move

1
मुझे नहीं पता था कि npm installpackage.json को लिख सकते हैं। क्या आप जानते हैं कि यह यहाँ क्या लिख ​​सकता है?
VEVE

5
अच्छी तरह से यह थोड़ा भ्रामक हो सकता है ... यह जब आप इसे स्थापित, अद्यतन, या निर्भरता को हटाने के लिए उपयोग करने के लिए package.json को लिखेंगे। मैं पाठ में और अधिक स्पष्ट करूँगा, धन्यवाद!
लुकासकारो

इस एल्गोरिथ्म का दस्तावेज कहां है? यानी तुम्हारा स्रोत क्या है?
यंगवार क्रिस्टियनसेन

1
@YngvarKristiansen यह npm प्रलेखन में है, संदर्भ के लिए विशिष्ट अनुभाग के लिए एक लिंक जोड़ा गया है
lucascaro

4
npm install packageदोनों को संशोधित कर सकता है package-lock.json और package.json , जबकि npm installwhithout तर्क केवल संशोधित करेगाpackage-lock.json
knobo

20

npm ciकिसी भी मौजूदा नोड_मॉडल फ़ोल्डर को हटा देगा और package-lock.jsonप्रत्येक पैकेज के विशिष्ट संस्करण को स्थापित करने के लिए फ़ाइल पर निर्भर करेगा। यह npm स्थापित की तुलना में काफी तेज है क्योंकि यह कुछ सुविधाओं को छोड़ देता है। यह साफ राज्य स्थापित है ci / cd पाइपलाइनों और डॉक बिल्ड के लिए बहुत अच्छा है! आप इसका उपयोग एक साथ सब कुछ स्थापित करने के लिए भी करते हैं और विशिष्ट पैकेजों में नहीं।


9

आपके द्वारा लिंक किए गए दस्तावेज़ में सारांश था:

संक्षेप में, npm स्थापित और npm ci का उपयोग करने के बीच मुख्य अंतर हैं:

  • परियोजना में एक मौजूदा पैकेज-लॉक.जॉन या एनपीएम-सिक्योरव्रेप.जॉन होना चाहिए।
  • यदि पैकेज लॉक की निर्भरता पैकेज में उन लोगों से मेल नहीं खाती है। पैकेज लॉक को अपडेट करने के बजाय, npm ci एक त्रुटि के साथ बाहर निकल जाएगा।
  • npm ci एक समय में केवल संपूर्ण प्रोजेक्ट स्थापित कर सकता है: इस निर्भरता के साथ व्यक्तिगत निर्भरता नहीं जोड़ी जा सकती है।
  • यदि एक नोड_मॉड्यूल्स पहले से मौजूद है, तो यह एनपीएमआई स्थापित होने से पहले स्वचालित रूप से हटा दिया जाएगा।
  • यह कभी भी package.json या किसी भी पैकेज-ताले को नहीं लिखेगा: इंस्टॉल अनिवार्य रूप से जमे हुए हैं।

2

कमांड्स कार्यक्षमता में बहुत समान हैं लेकिन अंतर आपके package.jsonऔर package-lock.jsonफाइलों में निर्दिष्ट निर्भरता को स्थापित करने के लिए उठाए गए दृष्टिकोण में है ।

npm cinpm installयदि आपके सिस्टम पर पहले से मौजूद हैं, तो अपने ऐप की सभी निर्भरताओं की एक साफ स्थापना करता है। एक समस्या उत्पन्न हो सकती है यदि सिस्टम पर पहले से इंस्टॉल किया गया संस्करण आपके package.jsonइंस्टाॅल को स्थापित करने का उद्देश्य नहीं है अर्थात स्थापित संस्करण ' आवश्यक ' संस्करण से भिन्न है ।

अन्य अंतर यह होगा कि npm ciआपकी package*.jsonफ़ाइलों को कभी नहीं छूता है। यह स्थापना को रोक देगा और एक त्रुटि दिखाएगा यदि निर्भरता संस्करण में package.jsonऔर package-lock.jsonफ़ाइलों में मेल नहीं खाते हैं ।

आप आधिकारिक डॉक्स से बहुत बेहतर स्पष्टीकरण यहां पढ़ सकते हैं ।

इसके अतिरिक्त, आप यहां पैकेज लॉक के बारे में पढ़ना चाह सकते हैं ।


1

यह ध्यान में रखने योग्य है कि अल्पाइन जैसी हल्की नोड डॉकटर छवियों में पायथन स्थापित नहीं है जो कि एक निर्भरता है node-gypजिसका उपयोग किया जाता है npm ci

मुझे लगता है कि यह थोड़ा सा माना जाता है कि npm ciकाम करने के लिए आपको अपने निर्माण में निर्भरता के रूप में पायथन को स्थापित करने की आवश्यकता है।

अधिक जानकारी यहाँ डॉकटर और npm - जिप ERR! ठीक नहीं है


0

जबकि बाकी सभी ने तकनीकी अंतरों का जवाब दिया है, कोई भी नहीं बताता है कि दोनों को किन स्थितियों में उपयोग करना है।

आपको उन्हें विभिन्न स्थितियों में उपयोग करना चाहिए।

npm installजब आप node_modulesनिर्देशिका को कैश करना चाहते हैं तो विकास के लिए और CI में बहुत अच्छा है । इसका उपयोग कब करें? आप ऐसा कर सकते हैं यदि आप अन्य लोगों के उपयोग के लिए एक पैकेज बना रहे हैं (आप node_modulesऐसी रिलीज़ में शामिल नहीं हैं ) । कैशिंग के बारे में, सावधान रहें, अगर आप Node.jsयाद रखने के विभिन्न संस्करणों का समर्थन करने की योजना बनाते हैं, node_modulesजो Node.jsरनवे की आवश्यकताओं के बीच अंतर के कारण पुनः स्थापित करना पड़ सकता है । यदि आप एक संस्करण से चिपके रहना चाहते हैं, तो नवीनतम से चिपके रहें LTS

npm ciजब आप किसी प्रोडक्शन एप्लिकेशन (एक अंतिम उत्पाद, अन्य पैकेजों द्वारा उपयोग नहीं किया जा सके) का परीक्षण और रिलीज करने के लिए उपयोग किया जाना चाहिए क्योंकि यह महत्वपूर्ण है कि आपके पास इंस्टॉलेशन जितना संभव हो उतना निर्धारित हो, यह इंस्टॉल अधिक समय लगेगा लेकिन अंततः बना देगा आपका एप्लिकेशन अधिक विश्वसनीय है (आप node_modulesऐसी रिलीज़ में शामिल होते हैं) । के LTSसंस्करण के साथ छड़ी Node.js

बोनस: आप उन्हें मिश्रित कर सकते हैं कि आप इसे कितना जटिल बनाना चाहते हैं। gitआप में सुविधा शाखाओं पर node_modulesअपनी टीमों की उत्पादकता बढ़ाने के लिए कैश कर सकते हैं और मर्ज के अनुरोध पर और मास्टर शाखाओं npm ciएक निर्धारक परिणाम के लिए भरोसा करते हैं ।

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