2017-05-03 16 views
6

में एक ही एनपीएम पैकेज के दो संस्करण मैं नोडजेएस में एक सीएलआई उपकरण पर काम कर रहा हूं जो हमारे द्वारा विकसित एक और नोडजे पैकेज का उपयोग करता है, जो एक एसडीके है।नोड अनुप्रयोग

बात है, हम सिर्फ इतना है कि SDK का एक V2 संस्करण प्रकाशित किया जाता है, और हम CLI उपयोगकर्ता एक विरासत मोड प्रदान करना चाहते हैं, तो वे तो जैसे हमारी एसडीके के पहले या दूसरे संस्करण, उपयोग कर सकते हैं:

$ cli do-stuff 
#execute sdk v2 

या

$ LEGACY_MODE='on' cli do-stuff 
#execute sdk v1 

मेरे समस्या यह है कि मैं अपने CLI में एक ही निर्भरता के दो संस्करणों का उपयोग करने के लिए किसी भी स्वच्छ रास्ता नहीं मिला था। मैंने npm-install-version पैकेज का उपयोग करने का प्रयास किया। यह मेरे स्थानीय पर्यावरण पर अच्छा काम करता है, लेकिन मेरे क्ली को प्रकाशित करने और npm install -g my-cli करने के बाद, यह अब काम नहीं करता है, क्योंकि यह /usr/local/lib/node_modules/my-cli फ़ोल्डर के बजाय वर्तमान फ़ोल्डर में node_modules फ़ोल्डर बनाता है। मैंने multidep भी कोशिश की, और मेरे पास एक ही समस्या है।

अभी के लिए, मेरी package.json मेरे सारे एसडीके में शामिल नहीं है, लेकिन मैं कुछ ऐसा करना चाहते हैं:

"dependencies": { 
    "my-sdk": "2.0.0" 
    "my-sdk-legacy": "1.0.0" 
} 

या

"dependencies": { 
    "my-sdk": ["2.0.0", "1.0.0"] 
} 

मैं नहीं मिला है कुछ और अभी तक। मैं अपने एसडीके पैकेज के पहले संस्करण को "my-sdk-legacy" जैसे दूसरे नाम के साथ प्रकाशित करने के बारे में सोच रहा हूं, लेकिन यदि संभव हो तो मैं इससे बचना चाहूंगा।

इसके लिए कोई समाधान?

उत्तर

3

तो यह वास्तव में एक आम परिदृश्य है जिसे कई बार संबोधित किया गया था।

npm के लिए एक बंद समस्या है और yarn पैकेज प्रबंधक के लिए एक समस्या जारी है।

एक अलग नाम से एक अलग पैकेज प्रकाशित करें:


पहले समाधान में this जी एच टिप्पणी NPM के लेखक द्वारा सुझाव दिया गया था। इसके अंदर एक विशिष्ट संस्करण की आवश्यकता होगी।

{ "name": "express3", 
    "version": "1.0.0", 
    "description":"Express version 3", 
    "dependencies": { "express":"3" } } 

// index.js 
module.exports = require('express') 

अपने मामले में आप my-sdk-v1 और my-sdk-v2 प्रकाशित करेंगे। और अब से आप आसानी से एक परियोजना में पैकेज के 2 संस्करणों को बिना किसी संघर्ष के चला सकते हैं।

const mySDKLegacy = require('my-sdk-v1'); 
const mySDKModern = require('my-sdk-v2'); 

second way बहुत ज्यादा एक ही विचार का प्रस्ताव - उपयोग Git यूआरएल:

{ 
    "my-sdk-v1": "git://github.com/user/my-sdk#1.0.0", 
    "my-sdk-v2": "git://github.com/user/my-sdk#2.0.0" 
} 

NPM पैकेज के विपरीत, आप किसी भी नाम आप चाहते हैं चुनने के लिए स्वतंत्र हैं! सच्चाई का स्रोत गिट यूआरएल है।

Laternpm-install-version पॉप अप किया गया। Buuut, जैसा कि आप पहले ही साबित कर चुके हैं, इसका उपयोग थोड़ा सीमित है। चूंकि यह कुछ आदेशों को निष्पादित करने और tmp dirs को लिखने के लिए एक बाल प्रक्रिया को जन्म देता है। एक सीएलआई के लिए सबसे विश्वसनीय तरीका नहीं है।

संक्षेप में: आप GitHub रेपो नाम के बाद से & टैग को बदल सकता है, विकल्प 1 & 2. मैं पहले एक साथ रहना चाहते हैं के साथ छोड़ दिया जाता है।

गिट यूआरएल के साथ दूसरा विकल्प बेहतर है जब आप एक संस्करण को अधिक बार निर्भर करने के लिए बदलना चाहते हैं। कल्पना कीजिए कि आप मेरी-एसडीके-वी 1 विरासत के लिए एक सुरक्षा पैच प्रकाशित करना चाहते हैं। एक गिट यूआरएल को संदर्भित करना आसान होगा, फिर my-sdk-v1.1 को बार-बार एनपीएम पर प्रकाशित करें।

+2

मैंने दूसरे संस्करण की कोशिश की, लेकिन बात यह है कि, एनपीएम गिट से चेकआउट के बाद फ़ोल्डर का नाम नहीं बदलता है। '' 'node_modules''' फ़ोल्डर में," my-sdk "नामक केवल एक फ़ोल्डर है। तो निम्न कोड '' 'की आवश्यकता नहीं है ('my-sdk-v1');' '' लेकिन मैं '' 'की आवश्यकता हो सकती है ('my-sdk');' '' तो मैं मुझे लगता है कि मैं पहले संस्करण में रहूंगा, भले ही यह मेरे लिए थोड़ा कम सुविधाजनक हो। धन्यवाद – Greg