मैं नेस्टेड एनपीएम निर्भरता संस्करणों को कैसे ओवरराइड करूं?


290

मैं का उपयोग करना चाहते हैं grunt-contrib-jasmine एनपीएम पैकेज । इसकी विभिन्न निर्भरताएँ हैं। निर्भरता ग्राफ का हिस्सा इस तरह दिखता है:

─┬ grunt-contrib-jasmine@0.4.1
  ├─┬ grunt-lib-phantomjs@0.2.0
   ├─┬ phantomjs@1.8.2-2

दुर्भाग्य से, इस संस्करण में एक बग है phantomjs जो इसे मैक ओएस एक्स पर सही तरीके से स्थापित करने से रोकता है। यह नवीनतम संस्करण में तय किया गया है।

मुझे कैसे मिल सकता हैं grunt-lib-phantomjs नए संस्करण का उपयोगphantomjs ?

कुछ अतिरिक्त संदर्भ:


बस git cloneया कांटा आवश्यक मॉड्यूल। आप phantomjsमैन्युअल रूप से नेस्टेड भी निकाल सकते हैं ।
अलेक्सी ज़ाब्रोद्स्की

3
grunt-contrib-jasmine0.5.1 पर है, जो उपयोग करता है grunt-lib-phantomjs@0.3.1, जो phantomjs@1.9.1-0:) का उपयोग करता है
gustavohenke

जवाबों:


238

आप npm संकोचन का उपयोग कर सकते हैं किसी भी निर्भरता या उप-निर्भरता को ओवरराइड करने के लिए, कार्यक्षमता का ।

मैंने अभी-अभी हमारी इस गंभीर परियोजना को पूरा किया है। हमें 2.7.3 के बाद से कनेक्ट का एक नया संस्करण चाहिए। हमारे लिए परेशानी खड़ी कर रहा था। इसलिए मैंने एक फाइल बनाई, जिसका नाम npm-compresswrap.json:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "grunt-contrib-connect@0.3.0",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}

npm परियोजना के लिए स्थापित करते समय इसे स्वचालित रूप से चुनना चाहिए।

(देखें: https://nodejs.org/en/blog/npm/managing-node-js-d dependencies-with-shrinkwrap/ )


7
जब मैं ऐसा करता हूं, तो केवल grunt-contrib-connectनिर्भरता और उसके बच्चे स्थापित होते हैं। पैकेज में मेरे अन्य सभी निर्भरताएँ नहीं हैं।
IDVB

5
मैं @ivdb के रूप में एक ही मुद्दा था। मैंने node_modulesनिर्देशिका को संपादित करना समाप्त कर दिया, ताकि पूर्ण संकोचन निर्भरता डंप वास्तव में मैं चाहता था, न कि केवल ओवरराइड। लेकिन फिर भी एक तरह का दर्दनाक समाधान।
कोबोल्ड

2
@Domi इस फाइल को npm सिक्रेट्रैप चलाकर बनाया गया है, प्रविष्टियाँ हाथ से नहीं जोड़ी जाती हैं
ग्लास डिस्क्लेमर

13
दुर्भाग्य से, जैसा कि उस बग में उल्लेख किया गया है, npm4 के साथ, न्यूनतर दृष्टिकोण अब काम नहीं करता है। (हटाते समय node_modules, न्यूनतम सिकुड़न के साथ एक इंस्टालेशन चलाने से लगता devDependenciesहै कि वह अनदेखी कर रहा है dependencies, लेकिन दूसरी इंस्टॉलेशन को चलाने से गैर-स्पष्ट आइटम निकल जाते हैं, इसलिए अब npm shrinkwrapपूर्ण फ़ाइल प्राप्त करने के लिए दौड़ना महत्वपूर्ण है , प्रश्न में भाग को संशोधित करें, और फिर भागना npm install)
ब्रेट ज़मीर

6
npm 6.4 केवल
सिकुड़ा हुआ

84

2018 और उससे आगे के लोगों के लिए, npm संस्करण 5 या बाद के संस्करण का उपयोग करके: अपने को संपादित करें package-lock.json: लाइब्रेरी को "requires"अनुभाग से निकालें और इसे "निर्भरता" के तहत जोड़ें।

उदाहरण के लिए, आप चाहते हैं कि deglobपैकेज अपने वर्तमान के बजाय globपैकेज संस्करण का उपयोग करे 3.2.11। आप खोलें package-lock.jsonऔर देखें:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "glob": "7.1.2",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  }
},

निकालें "glob": "7.1.2",से "requires", जोड़ने के "dependencies"उचित संस्करण के साथ:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  },
  "dependencies": {
    "glob": {
      "version": "3.2.11"
    }
  }
},

अब अपने node_modulesफ़ोल्डर को हटा दें , चलाएं npm installऔर यह लापता भागों को "dependencies"अनुभाग में जोड़ देगा ।


4
यह अच्छा है, जब तक कि npm installएक समय चलता है। मेरे मामले में संपादन आवश्यक हैं क्योंकि नेस्टेड dep एक असफलता का कारण बन रहा है।
ppasler

59
यह npm iआपके पैकेज-लॉक.जोन को संपादित करने और "निर्भरता" के लिए बच्चे की निर्भरता को जोड़ने के बजाय आपके द्वारा चलाए जाने के बजाय किसी भी समय हटा दिया जाएगा, अपने पैकेज में बच्चे की निर्भरता को जोड़ें। "निर्भरता" अनुभाग
ट्रिकीपट्टी

6
मैंने एक पुस्तकालय बनाया है जो आपके लिए अपने आप ही ऐसा करता है: github.com/rogeriochaves/npm-force-resolutions
Rogerio Chaves

14
यह काम करता है लेकिन फिर अगर मैं npm installफिर से दौड़ता हूं तो वापस आने के लिए सभी परिवर्तन होते package-lock.jsonहैं और मुझे डिप बैक का खराब संस्करण मिलता है।
2rs2ts

14
मैं चलाता हूं npm ciऔर यह package-lock.json
10

31

यार्न का उपयोग करने वालों के लिए।

मैंने npm सिक्रेट्रैप का उपयोग करने की कोशिश की जब तक कि मुझे पता नहीं चला कि यार्न क्ली ने मेरी npm-संकोwrap.json फ़ाइल को अनदेखा कर दिया है।

यार्न के पास इसके लिए https://yarnpkg.com/lang/en/docs/selective-version-resolutions/ है। साफ।

इस उत्तर को भी देखें: https://stackoverflow.com/a/41082766/3051080


0

मेरे पास एक मुद्दा था जहां एक नेस्टेड निर्भरता में एक एनपीएम ऑडिट भेद्यता थी, लेकिन मैं अभी भी मूल निर्भरता संस्करण को बनाए रखना चाहता था। npm संकोचन समाधान मेरे लिए काम नहीं किया, इसलिए मैंने नेस्टेड निर्भरता संस्करण को ओवरराइड करने के लिए क्या किया:

  1. पैकेज-लॉक.जॉन में 'आवश्यकता' अनुभाग के तहत नेस्टेड निर्भरता निकालें
  2. पैकेज.जन में देव निर्भरता के तहत अद्यतन निर्भरता जोड़ें, ताकि मॉड्यूल की आवश्यकता होती है जो अभी भी इसे एक्सेस करने में सक्षम होंगे।
  3. npm i

-1

एनपीएम सिक्रेट्रैप इस समस्या का एक अच्छा समाधान प्रदान करता है। यह हमें एक विशेष उप-मॉड्यूल की विशेष निर्भरता के उस संस्करण को ओवरराइड करने की अनुमति देता है।

अनिवार्य रूप से, जब आप npm इंस्टॉल चलाते हैं, तो npm आपके रूट डाइरेक्टरी में पहली बार यह देखने के लिए दिखाई देगा कि क्या npm-compresswrap.json फ़ाइल मौजूद है। यदि ऐसा होता है, तो यह पैकेज निर्भरता को निर्धारित करने के लिए सबसे पहले इसका उपयोग करेगा, और फिर पैकेज के माध्यम से काम करने की सामान्य प्रक्रिया में वापस आ जाएगा। फ़ाइल फ़ाइलें।

एक npm-compresswrap.json बनाने के लिए, आपको बस इतना करना है

 npm shrinkwrap --dev

कोड:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "grunt-contrib-connect@0.3.0",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}

3
क्या यह वर्तमान में स्वीकृत उत्तर से अलग है? उस उत्तर में दो उकेरे गए सुझाव हैं जो बताते हैं कि npm के नए संस्करणों को या तो अतिरिक्त मैनुअल चरणों की आवश्यकता है, या इस समाधान के साथ अवांछनीय चीजें करें। क्या यह मामला नहीं है?
फैबियो बेल्ट्रामिनी

-1

मुझे एक समाधान मिला जो मेरे लिए काम करता है।

इसलिए। सबसे पहले अपने npm-compresswrap.json फ़ाइल को संपादित करें जैसा कि सभी अन्य समाधानों की सिफारिश की गई है।

फिर, (विंडोज पर):

  • 'Npm-compresswrap.json' फाइल पर राइट क्लिक करें
  • गुण
  • विशेषताओं के तहत 'केवल पढ़ने के लिए' का चयन करें। यह mpn-compresswrap.json फ़ाइल को संशोधित करने के लिए npm को रोक देगा।

यदि आप 'npm इंस्टॉल' ऑपरेशन को केवल एक बार कर रहे हैं, तो अन्य प्रस्तावित समाधान पर्याप्त हैं। लेकिन पहले 'npm इंस्टॉल' के बाद फाइल 'npm-संकोwrap.json' आपके संशोधन से पहले फिर से संशोधित हो जाती है।


-1: इससे आपको हर बार जब आप परिवर्तन करना चाहते हैं, तो आपको फ़ाइल को फिर से अनलॉक करना होगा। उन मामलों में, आप वैसे भी संकोचन फ़ाइल में मैन्युअल संपादन को ढीला कर देंगे। इसके अतिरिक्त आपके कोड पर सहयोग करने वाले किसी व्यक्ति को भी इस हैक को सक्षम करने की आवश्यकता है।
थोमक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.