npm का उपयोग करके पैकेज के कई संस्करणों को कैसे स्थापित किया जाए


100

Https://github.com/npm/npm/issues/2943 के कारण , npm कभी भी एक ही पैकेज के कई संस्करणों को स्थापित करने और स्थापित करने की क्षमता का समर्थन नहीं करेगा।

गिथब मुद्दे पर पोस्ट किए गए वर्कअराउंड शुद्ध-जेएस मॉड्यूल के लिए काम कर सकते हैं, लेकिन जैसे ही npm फ्रंटएंड पैकेज प्रबंधन के लिए एक मानक बन जाता है, पैकेजों में अब CSS जैसी विभिन्न संपत्तियां शामिल हैं।

क्या एक ही पैकेज के कई संस्करणों को स्थापित करने के लिए कोई समाधान है?

मेरे पास सबसे अच्छा विचार एक पैकेज "क्लोन" करना है, और इसे थोड़ा अलग नाम के साथ प्रकाशित करना है।

उदाहरण के लिए, यदि आप एक से अधिक संस्करण की जरूरत है jquery, तो आप सिर्फ संकुल बुलाया प्रकाशित कर सकता jquery-alias1, jquery-alias2, jquery-alias3आदि, और फिर अपने में उचित संस्करणों सेट package.json

या आप उनके संस्करण संख्या, उदाहरण jquery-1.11.xके लिए jquery-2.1.x, आदि के अनुसार संकुल का नाम दे सकते हैं ।

ये दोनों दृष्टिकोण हालांकि टेढ़े लगते हैं। क्या बेहतर हैं?


फ्रंटएंड पैकेज प्रबंधन में मानक नहीं है जो आसानी से ऐसा कर सकता है
लैगिंगसर्फ्लेक्स

हाँ बोवर यहाँ एक विकल्प की तरह लगता है। यह बहुत बुरा है एक npm समाधान प्रतीत नहीं होता है, क्योंकि एक बड़ी टीम के लिए एक और पैकेज प्रबंधन प्रणाली शुरू करना मुश्किल हो सकता है। खासकर यदि आपके पास पहले से ही एनपीएम (जैसे कि एक निजी एनपीएम रजिस्ट्री सर्वर) का समर्थन करने के लिए बुनियादी ढांचा है
चिह्नित करें।

जवाबों:


102

Npm v6.9.0 के रूप में , npm अब पैकेज उपनामों का समर्थन करता है। यह यार्न के उपयोग के समान सिंटैक्स लागू करता है:

npm install jquery2@npm:jquery@2
npm install jquery3@npm:jquery@3

यह निम्नलिखित जोड़ता है package.json:

"dependencies": {
   "jquery2": "npm:jquery@^2.2.4",
   "jquery3": "npm:jquery@^3.4.1"
}

इस सिंटैक्स के साथ GitHub से सीधे इंस्टॉल करना भी संभव है। उदाहरण के लिए, यदि आप npm रजिस्ट्री संस्करण और पैकेज के एक GitHub कांटा दोनों को स्थापित करना चाहते हैं foobar:

npm install foobar
npm install foobar-fork@github:username/foobar

1
यार्न पैकेज एलियासिंग का भी समर्थन करता है
ग्रेग के

नमस्ते, मैंने 2 पैकेज स्थापित करने के लिए इन चरणों की कोशिश की है: "प्रतिक्रिया-देशी-ट्रैक-खिलाड़ी": "1.1.4" और "प्रतिक्रिया-मूल-ट्रैक-खिलाड़ी": "1.1.8"। यह iOS पर अच्छी तरह से काम करता है, लेकिन एंड्रॉइड पर यह एक त्रुटि दिखाता है कि "MusicManager $ 1 को कई बार परिभाषित किया गया है"। मैं एंड्रॉइड को 1.1.8 बनाने से कैसे रोक सकता हूं?
EmBeCoRau

लाइब्रेरी में कुछ संघर्ष के कारण, मुझे iOS पर 1.1.8 और Android पर 1.1.4 का उपयोग करने की आवश्यकता है
EmBeCoRau

मुझ पर निर्भरता के उपनाम के रूप में काम नहीं किया, जो इसे ढूंढ रहा था, यानी इसे ढूंढ रहा था eslint, लेकिन यह अब नाम नहीं थाeslint6
क्रिमबो

75

मैं अपने जैसे किसी व्यक्ति के लिए यहां पोस्ट करना चाहता था जो यार्न का उपयोग कर रहा है और यहां उतरा है। यह NPM के लिए अधिक या कम ड्रॉप-इन प्रतिस्थापन है जो बॉक्स से बाहर होने का समर्थन करता है:

yarn add material-ui@latest
yarn add material-ui-next@npm:material-ui@next
then

import FlatButton from 'material-ui/FlatButton'; // v0.x
import Button from 'material-ui-next/Button'; // v1.x

(उदाहरण के लिए क्रेडिट https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601 पर जाता है )


17
धन्यवाद। बस स्पष्ट करने के लिए कि सामान्य सूत्र है <alternative-name>@npm:<package-name>@<version>
निकोसकेज

5

ऐसा लगता है कि "JSPM" ठीक वही उपकरण हो सकता है जिसे आप खोज रहे हैं। JSPM NPM के शीर्ष पर बनाता है, लेकिन आपको कई स्रोतों (github, npm, आदि) से पैकेज खींचने की अनुमति देता है। यह लोडिंग मॉड्यूल के लिए सामने के छोर पर System.js यूनिवर्सल मॉड्यूल लोडर का उपयोग करता है, और "संस्करण-प्रत्यय फ़ोल्डर में डाउनलोड करने के लिए फ्लैट संस्करण प्रबंधन का उपयोग करता है" जो कि कारण के लिए आसान है।

jspm.io

जब आप jspm के साथ एक पैकेज स्थापित करते हैं, तो आप उस पैकेज को किसी विशेष नाम से अलियास कर सकते हैं, जिसे आप बाद में requireविशेष रूप से अपने मॉड्यूल में रख सकते हैं ।

$ jspm install jquery
... (status msgs) ...
ok   Installed jquery as github:components/jquery@^2.1.4 (2.1.4)

$ jspm install jqueryOne=jquery@1.11.3
... (status msgs) ...
ok   Installed jqueryOne as github:components/jquery@1.11.3 (1.11.3)

      github:components/jquery 1.11.3 2.1.4

तब आपके जेएस में, आप बस require(jquery)और / या require(jqueryOne)आवश्यकतानुसार, आपको आवश्यक रूप से आगे और पीछे जाने की अनुमति दे सकते हैं।

यह किसी भी पैकेज के लिए समान है जिसे आप कई संस्करणों का उपयोग करना चाहते हैं।


2

Npm के काम करने के तरीके के कारण, इसे साफ-सुथरा करना काफी मुश्किल है, इसलिए मैं इसे उत्पादन में करने के प्रयास से बचूंगा।

हालांकि, एकीकरण परीक्षण और इसी तरह के उपयोग के मामलों के लिए, मैंने एक पैकेज बनाया जिसे मल्टीपैप कहा गया है , जो आपको एक ही पैकेज के कई संस्करण स्थापित करने देता है और requireउन्हें पसंद करता है:

var multidepPackages = require('multidep')('test/multidep.json');

var jquery1 = multidepRequire('jquery', '1.11.3');
var jquery2 = multidepRequire('jquery', '2.1.4');

0

एनपीएम इंस्टॉल संस्करण ( https://github.com/scott113341/npm-install-version ) भी एक विकल्प है। यह अनिवार्य रूप से वही करता है जो यहां के कुछ अन्य समाधान (तकनीकी रूप से बोलने वाले) करते हैं लेकिन उपयोग करने के लिए काफी सरल हैं। संस्करण संख्या के साथ स्थापित मॉड्यूल (एनपीएम द्वारा उपयोग किए जाने वाले मानक @version कमांड परम) उस नाम के साथ नोड_मॉड्यूल के तहत उप-फ़ोल्डर में अनुमानित रूप से स्थापित किए जाते हैं । आप प्रति मॉड्यूल गंतव्य डेअर को भी नियंत्रित कर सकते हैं - जो बिल्ड सिस्टम के साथ उपयोगी है।

GitHub डॉक्स से उपयोग कोड स्निपेट:

const niv = require('npm-install-version');
const benchmark = require('./some-benchmark-function.js');

niv.install('csjs@1.0.0');
// installs csjs@1.0.0 to node_modules/csjs@1.0.0/

niv.install('csjs@1.0.1');
// installs csjs@1.0.1 to node_modules/csjs@1.0.1/

const csjs_old = niv.require('csjs@1.0.0');
const csjs_new = niv.require('csjs@1.0.1');
// require the old and new versions of csjs

benchmark([csjs_old, csjs_new], 'some-test-input');
// run our fake benchmark function on the old and new versions of csjs

0

install-npm-version( https://github.com/scott-lin/install-npm-version ) अभी तक एक और विकल्प है। इसका उपयोग कमांड लाइन पर, या प्रोग्रामेटिक इंटरफ़ेस के माध्यम से किया जा सकता है - आधुनिक विकास के लिए टाइपस्क्रिप्ट में लिखा गया है।

उदाहरण # 1: संस्करणित (डिफ़ॉल्ट) निर्देशिका में स्थापित करें

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0');
// installs chalk@2.4.0 to node_modules/chalk@2.4.0/

inv.Install('chalk@2.4.1');
// installs chalk@2.4.1 to node_modules/chalk@2.4.1/

उदाहरण # 2: कस्टम निर्देशिका में स्थापित करें

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0', { 'Destination': 'some/path/chalk' });
// installs chalk@2.4.0 to node_modules/some/path/chalk/

उदाहरण # 3: चुप या शोर मानक आउटपुट के साथ स्थापित करें

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0', { 'Verbosity': 'Silent' });
inv.Install('chalk@2.4.0', { 'Verbosity': 'Debug' });

उदाहरण # 4: मौजूदा संस्थापन को अधिलेखित करें

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0', { 'Destination': 'mydir' });
// installs chalk@2.4.0 to node_modules/mydir/

inv.Install('chalk@2.4.1', { 'Destination': 'mydir' });
// does not install chalk@2.4.1 since node_modules/mydir/ already exists

inv.Install('chalk@2.4.1', { 'Destination': 'mydir', 'Overwrite': true });
// installs chalk@2.4.1 to node_modules/mydir/ by overwriting existing install

0

मेरे मामले में, मुझे विश्व स्तर पर स्थापित संस्करण की तुलना में क्रिएट-रिएक्शन-ऐप का एक पुराना संस्करण स्थापित करने की आवश्यकता थी, क्योंकि मैं एक ऐसा कोर्स ले रहा था जिसमें असाइनमेंट के लिए इस पुराने संस्करण की आवश्यकता थी।

मैंने इस पुराने संस्करण को समाहित करने के लिए एक नया फ़ोल्डर बनाया है, इस में cd'd, और किया

npm init

इस शेल पैकेज को सेट करने के बाद। मैंने अपना बनाया हुआ रिएक्ट-ऐप का सटीक संस्करण स्थापित किया, जिसकी मुझे आवश्यकता थी

npm install create-react-app@1.5.2

जो स्थानीय-create_modules फ़ोल्डर को क्रिएट-रिएक्शन-ऐप के पुराने संस्करण के साथ बनाता है।

फिर मैंने इस पुराने संस्करण के शॉर्टकट के रूप में एक साधारण बैश स्क्रिप्ट (create-react-app.sh) बनाई और सभी तर्कों को आगे बढ़ाने के लिए bash वैरिएबल "$ @" का उपयोग किया:

#!/bin/bash
{full-directory-path}/node_modules/create-react-app/index.js "$@"

अंत में, मैंने इस सरल बैश स्क्रिप्ट को निष्पादन योग्य बना दिया

chmod u+x create-react-app.sh

तो सीधे इस बैश स्क्रिप्ट को बनाने के पुराने संस्करण को निष्पादित करेगा प्रतिक्रिया-ऐप:

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