Npm में वैकल्पिक निर्भरता?


23

मैं करने के लिए इसी तरह की एक सवाल है इस है, लेकिन से भिन्न।

मैं अपने ऐप के उपयोगकर्ता के लिए इसे स्थापित करना चाहूंगा कि जिस तरह से वह इसका उपयोग करना चाहता है, उसके लिए जो कुछ निर्भरताएं आवश्यक हैं। इसलिए, उदाहरण के लिए, यदि वे MongoDB के लिए बने रहना चाहते हैं, तो केवल Mongo- संबंधित लाइब्रेरी स्थापित की जाएंगी, लेकिन यदि वे Redis को जारी रखना चाहते हैं, तो केवल Redis- संबंधित लाइब्रेरी स्थापित की जाएंगी। मैं उन्हें उन पुस्तकालयों को डाउनलोड और इंस्टॉल नहीं करना चाहता, जिनका वे उपयोग नहीं कर रहे हैं।

मुझे पता है कि मैं विकास के उद्देश्यों के लिए ऐसा कर सकता हूं devDependencies, लेकिन यह उससे कहीं आगे जाता है। जैसा कि ऊपर दिए गए प्रश्न के उत्तर में कहा गया है, यह पायथन setuptools extras_requireऔर क्लूजुर की leiningenप्रोफाइल से अधिक निकटता से संबंधित है । Npm में ऐसा कुछ भी? मुझे वास्तव में ऐसा लगता है कि निर्भरता को निर्दिष्ट करने के अधिक बहुमुखी तरीके का devDependenciesएक devप्रोफाइल होना चाहिए ।


बस एक विचार लेकिन आप कई पैकेजों के साथ जा सकते हैं। MyPackage-Core MyPackage-Db-Mongo MyPackage-Db-Redisआदि ... बहुत से लोग बोवर मॉड्यूल करते हैं जो कोणीयज का विस्तार करने के लिए होते हैं
माइक

@ माइक: हम्म धन्यवाद, मैं इस पर विचार करूंगा। मुझे अभी भी लगता है कि यह एक सीमा है package.jsonजो अन्य पैकेज प्रबंधकों में हल की गई है।
imiric

1
यह एक महान प्रश्न है, लेकिन मुझे लगता है कि यह ऑफ-टॉपिक है क्योंकि यह कुछ टूल का उपयोग करने के बारे में है। इस तरह के प्रश्न केवल विषय पर होते हैं यदि वे कवर करते हैं कि उपकरण किसी विकास प्रक्रिया में कैसे एकीकृत होता है - आखिरकार, यह साइट सॉफ्टवेयर इंजीनियरिंग के बारे में है। विवरण के लिए हमारा सहायता केंद्र देखें। कृपया पढ़ें: मेरा उपकरण प्रश्न कहां जाता है? स्टैक ओवरफ्लो पर एनपीएम जैसे विकास साधनों का उपयोग विषय पर होगा।
आमोन

जवाबों:


9

Codependency मॉड्यूल हो सकता है कि आप क्या ढूंढ रहे हैं, या कुछ भी है कि करने के लिए कुछ ऐसा ही:

  • वैकल्पिक आश्रितता की घोषणा करें package.jsonजो स्वचालित रूप से स्थापित नहीं है npm install, कहते हैंoptionalPeerDependencies
  • एक कस्टम require-स्टाइल फ़ंक्शन जिसके बारे में जानता है optionalPeerDependenciesऔर सही काम करता है, जिसमें फेंकने / चेतावनी सहित कुछ भी नहीं पाया जाता है जो मॉड्यूल के एक आवश्यक वर्ग को पूरा करता है (जैसे न तो redis, न ही mongo, न ही mysql, आदि स्थापित हैं)।
  • इस मॉड्यूल के उपभोक्ता वैकल्पिक पीयर मॉड्यूल के कम से कम 1 स्थापित करने की अपेक्षा का दस्तावेजीकरण करते हैं

एक बदलाव यह होगा कि मॉड्यूल की मुख्य कार्यक्षमता बिना किसी वैकल्पिक निर्भरता (जैसे प्लगइन पैटर्न) के बिना काम करती है, कोई त्रुटि / चेतावनी नहीं है जब कुछ भी नहीं मिला है जो एक सहकर्मी निर्भरता को पूरा करता है।

एक और भिन्नता उत्पादन बनाम विकास निर्भरता, यानी के लिए एक एनालॉग dependenciesऔर के लिए लेखांकन करते समय ऊपर की सूची कर रही है devDependencies

शायद ऑन-डिमांड के साथ संयुक्त की आवश्यकता होती है जैसे कि वैकल्पिक मॉड्यूल की आवश्यकता होती है lazily, जैसे:

exports = {
    Core : require('./core'),
    get redis(){ return require('./redis'); },
    get mongo(){ return require('./mongo'); }
}

मुझे कुछ समय के लिए इसकी आवश्यकता नहीं है, लेकिन मुझे लगता है कि यह मेरे पास मौजूद समस्या को हल करता है। धन्यवाद!
इमिरिक

2
हाँ, मुझे लगा कि यह महीनों पुराना हो रहा है। मैंने आपके प्रश्न का उत्तर स्वयं खोजते हुए पाया, इसलिए यह ज्यादातर उत्तर-आधुनिकता के लिए था। एक बार से अधिक मैं खोज कर चुका हूं, केवल कुछ साल पहले खुद से लिखे गए उत्तर को खोजने के लिए। तो इस प्रबुद्ध आत्म हित पर विचार करें। इसके अलावा, सामान्य रूप से वर्णन करने के लिए codependencyकि मॉड्यूल इस घटना में क्या मॉड्यूल एनपीएम से वाष्पीकृत करता है प्रदान करता है और क्योंकि बिना अंश के लिंक खराब एसओ रूप हैं , इसका उत्तर अद्यतन किया ।
टूलबार

9

आप प्लग इन, जैसे की तरह साधारण वैकल्पिक निर्भरता चाहते हैं यदि आप foo स्थापित आप इसे रंगीन लेकिन अगर स्थापित नहीं, आप किसी भी समस्या नहीं है और भूरे रंग में इसे देख, तो आप इस्तेमाल कर सकते हैं चलेंगे optionalDependecies package.json में :

{
  "name": "watchit",
  "version": "1.2.3",
  "optionalDependencies": {
    "foo": "^2.0.0"
  }
}

और कोड में:

try {
  var foo = require('foo')
  var fooVersion = require('foo/package.json').version
} catch (er) {
  foo = null
}
if ( notGoodFooVersion(fooVersion) ) {
  foo = null
}

// .. then later in your program ..

if (foo) {
  foo.doFooThings()
}

Package.json प्रलेखन से निकाला गया ।


1

मैं क्या करता हूं अपने पैकेज में एक स्थापित स्क्रिप्ट को कॉन्फ़िगर करें। scriptsइस तरह , अंदर , अंदर :

"install": "node ./my-tools/my-install.js",

यह npm installखत्म होने के बाद सही चलेगा । मैं इसका इस्तेमाल ज्यादातर ऑटो- .envडिफॉल्ट वाली फाइल जेनरेट करने के लिए करता हूं ।

my-install.jsस्क्रिप्ट विभिन्न आदेशों को चलाने सकता है, फ़ाइलों को बनाने, उपयोगकर्ता इनपुट के लिए पूछना, इसलिए आप कह सकते हैं "चाहते हैं Redis या मोंगो?":

const exec = require('child_process').exec;
const readline = require('readline');

// Insert "Ask question script" here
// using readline core module

if ( option == 'mongo' )
  exec('npm install mongoose');

if ( option == 'redis' )
  exec('npm install redis');

यह एक बहुत ही त्वरित उत्तर है, उपयोगकर्ता इनपुट को ठीक से पढ़ने के लिए रीडलाइन देखें और कमांड चलाने और प्रसंस्करण के लिए बच्चे की प्रक्रिया , आदि।

यह भी ध्यान दें कि इंस्‍टॉल स्क्रिप्ट आपकी इच्छानुसार हो सकती है (अजगर, बैश आदि)


2
उपयोगकर्ता इनपुट के लिए पूछना स्वचालित बिल्ड को खराब कर देगा। npm installइंस्टॉल स्क्रिप्ट के अंदर फिर से चलने से अनपेक्षित व्यवहार भी हो सकता है। मैं इस समाधान की सिफारिश नहीं करता हूं।
लैम्ब्डा फेयरी

1

एनपीएम वास्तव में इसके लिए डिज़ाइन नहीं किया गया था, क्योंकि निर्भरता प्रबंधन के सबसे कठिन हिस्सों में से एक तेज, प्रतिलिपि प्रस्तुत करने योग्य बिल्ड सुनिश्चित करता है जो आसान और अपेक्षाकृत विफल होते हैं। लेकिन मेरा मानना ​​है कि उपयोग मामला है, और निश्चित रूप से मेरे लिए था। तो मैंने एक पैकेज लिखा कि आप जो पूछ रहे हैं, ठीक वैसा ही करें।

मेरा पैकेज है install-subset, और विश्व स्तर पर स्थापित किया जा सकता हैnpm install -g install-subset

https://www.npmjs.com/package/install-subset

सबसे पहले, आप अपने पैकेज में नामित सबटेट्स के लिए श्वेतसूची और ब्लैकलिस्ट का निर्माण करते हैं। इस तरह देखें:

"subsets": {
    "build": {
        "whitelist": [
            "babel-cli",
            "dotenv"
        ]
    },
    "test": {
        "blacklist": [
            "eslint",
            "lint-rules",
            "prettier"
        ]
    }
}

फिर, उदाहरण के लिए, install-subset test

यह आपके पैकेज को अस्थायी रूप से फिर से लिखेगा। उन पैकेजों को ब्लैकलिस्टेड स्थापित नहीं करने के लिए, फिर इसे पुनर्स्थापित करें, जो पैकेजों के आधार पर बहुत समय और बैंडविड्थ बचा सकता है।

यार्न के साथ भी काम करता है, खुला स्रोत है और मुद्दों / पीआर का स्वागत है।

कई मामलों में मैं इसे अपने ci सर्वर पर बिल्ड टाइम कम करने के लिए उपयोग करता हूं, और हमारे नवीनतम रिएक्ट नेटिव प्रोजेक्ट पर, हमारे विशिष्ट ताज़ा डेवलपर को 72 सेकंड से लगभग 20 सेकंड तक स्थापित किया।

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