come installare più versioni del pacchetto utilizzando npm


101

A causa di https://github.com/npm/npm/issues/2943 , npm non supporterà mai la possibilità di creare alias pacchetti e installare più versioni dello stesso pacchetto.

Le soluzioni alternative pubblicate sul problema gitHub potrebbero funzionare per i moduli JS puro, ma poiché npm diventa uno standard per la gestione dei pacchetti frontend, i pacchetti ora includono varie risorse come CSS.

Esiste una soluzione alternativa per installare più versioni dello stesso pacchetto?

L'idea migliore che mi è venuta è quella di "clonare" un pacchetto e pubblicarlo con un nome leggermente diverso.

Ad esempio, se avete bisogno di più versioni di jquery, si può solo pubblicare i pacchetti chiamati jquery-alias1, jquery-alias2, jquery-alias3ecc, e quindi impostare le versioni appropriate nel vostro package.json.

Oppure si potrebbe nominare i pacchetti in base al loro numero di versione, ad esempio jquery-1.11.x, jquery-2.1.x, ecc ..

Entrambi questi approcci sembrano però sciatti. Ce ne sono di migliori?


Non è lo standard nella gestione dei pacchetti frontend che può facilmente farlo .
laggingreflex

Sì, il pergolato sembra un'alternativa qui. Peccato che non sembri esserci una soluzione npm, poiché l'introduzione di un altro sistema di gestione dei pacchetti in un grande team può essere difficile. Soprattutto se hai già un'infrastruttura configurata per supportare npm (ad es. Un server di registro npm privato)
segna il

Risposte:


104

A partire da npm v6.9.0, npm ora supporta gli alias dei pacchetti. Esso implementa la stessa sintassi come usi Filati:

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

Questo aggiunge quanto segue a package.json:

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

È anche possibile installare direttamente da GitHub con questa sintassi. Ad esempio, se desideri installare sia la versione del registro di npm che un fork GitHub del pacchetto foobar:

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

1
il filato supporta anche l' aliasing del pacchetto
Greg K

Ciao, ho provato questi passaggi per installare il pacchetto 2: "react-native-track-player": "1.1.4" e "react-native-track-player": "1.1.8". Funziona bene su iOS, ma su Android mostra un errore che indica che "MusicManager $ 1 è definito più volte". Come posso impedire ad Android di creare 1.1.8?
EmBeCoRau

A causa di alcuni conflitti nella libreria, devo usare 1.1.8 su iOS e 1.1.4 su Android
EmBeCoRau

Non ha funzionato per me perché l'alias della dipendenza era diverso da quello che stava cercando, cioè stava cercando eslint, ma non sapevo che ora fosse chiamatoeslint6
Crimbo

75

Volevo postare qui per chiunque come me utilizzi Yarn ed è atterrato qui. È un sostituto più o meno immediato per NPM che supporta l'aliasing out of the box:

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

(il merito ad esempio va a https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601 )


17
Grazie. Giusto per chiarire che la formula generica è <alternative-name>@npm:<package-name>@<version>
NikosKeyz

5

Sembra che "JSPM" potrebbe essere esattamente lo strumento che stai cercando. JSPM si basa su NPM ma consente di estrarre pacchetti da più origini (github, npm, ecc.). Utilizza il caricatore di moduli universale System.js sul front-end per caricare i moduli e "utilizza la gestione delle versioni flat per il download in cartelle con suffisso di versione" su cui è facile ragionare.

jspm.io

Quando installi un pacchetto con jspm puoi alias quel pacchetto con un nome particolare, che puoi in seguito requirespecificatamente nei tuoi moduli.

$ 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

Quindi nel tuo js, ​​puoi semplicemente require(jquery) e / o require(jqueryOne)come necessario, permettendoti di andare avanti e indietro se necessario.

Questo vale per qualsiasi pacchetto di cui desideri utilizzare più versioni.


2

Questo è abbastanza difficile da fare in modo pulito, a causa del modo in cui funziona npm, quindi eviterei di tentare di farlo in produzione.

Tuttavia, per i test di integrazione e casi d'uso simili, ho creato un pacchetto chiamato multidep , che ti consente di installare più versioni dello stesso pacchetto e in requirequesto modo:

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

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

0

Un'altra opzione è la versione di installazione NPM ( https://github.com/scott113341/npm-install-version ). In sostanza, fa quello che fanno alcune delle altre soluzioni qui (tecnicamente parlando) ma è abbastanza semplice da usare. I moduli installati con un numero di versione (parametro del comando @version standard utilizzato da NPM) sono prevedibilmente installati in una sottocartella sotto node_modules con quel nome. Puoi anche controllare la directory di destinazione per modulo, il che è utile con i sistemi di compilazione.

Snippet di codice di utilizzo dalla documentazione di 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 ) è ancora un'altra opzione. Può essere utilizzato sulla riga di comando o tramite un'interfaccia programmatica, scritta in TypeScript per lo sviluppo moderno.

Esempio # 1: installazione nella directory con versione (predefinita)

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/

Esempio # 2: installazione nella directory personalizzata

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/

Esempio # 3: installazione con output standard silenzioso o rumoroso

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

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

Esempio n. 4: sovrascrivere un'installazione esistente

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

Nel mio caso, dovevo installare una versione precedente di create-react-app rispetto alla versione che avevo installato a livello globale, perché stavo frequentando un corso che richiedeva questa versione precedente per i compiti.

Ho creato una nuova cartella solo per contenere questa versione precedente, ci ho inserito un cd e ho creato un file

npm init

Dopo aver impostato questo shell package.json, ho installato la versione esatta di create-react-app di cui avevo bisogno

npm install create-react-app@1.5.2

che ha creato una cartella node_modules locale con la versione precedente di create-react-app.

Quindi ho creato un semplice script bash (create-react-app.sh) come scorciatoia per questa versione precedente e ho utilizzato la variabile bash "$ @" per inoltrare tutti gli argomenti:

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

Infine, ho reso eseguibile questo semplice script bash

chmod u+x create-react-app.sh

Quindi, l'esecuzione diretta di questo script bash eseguirà la versione precedente di create-react-app:

./create-react-app.sh  --version
1.5.2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.