2014-10-16 9 views
22

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

Le soluzioni alternative pubblicate sul problema github potrebbero funzionare per moduli JS puri, ma poiché npm diventa uno standard per la gestione dei pacchetti frontend, i pacchetti ora includono vari asset come i CSS.

C'è qualche soluzione alternativa per installare più versioni dello stesso pacchetto?

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

Per esempio, se avete bisogno di più versioni di jquery, si può solo pubblicare i pacchetti chiamati jquery-alias1, jquery-alias2, jquery-alias3 ecc, 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 sciatta però. Ce ne sono di migliori?

+0

Is not Bower lo standard per la gestione dei pacchetti frontend che può [facilmente farlo] (http://stackoverflow.com/questions/16442012/ Bower-installazione-2-versioni-di-jquery). – laggingreflex

+0

Sì, qui il pergolato sembra un'alternativa. Peccato che non ci sia una soluzione npm, in quanto l'introduzione di un altro sistema di gestione dei pacchetti in una grande squadra può essere difficile. Soprattutto se disponi già di un'infrastruttura per supportare npm (ad esempio un server privato di registro npm) – mark

risposta

4

Sembra che "JSPM" potrebbe essere esattamente lo strumento che stai cercando. JSPM si basa su NPM ma ti consente di estrarre pacchetti da più fonti (github, npm, ecc.). Utilizza il caricatore di moduli universali System.js sul front-end per il caricamento dei moduli e "utilizza la gestione delle versioni flat per il download in cartelle con suffisso versione" che sono facili da ragionare.

jspm.io

Quando si installa un pacchetto con JSPM si può alias che il pacchetto a un nome particolare, che si può poi require specificamente nei moduli.

$ jspm install jquery 
... (status msgs) ... 
ok Installed jquery as github:components/[email protected]^2.1.4 (2.1.4) 

$ jspm install [email protected] 
... (status msgs) ... 
ok Installed jqueryOne as github:components/[email protected] (1.11.3) 

     github:components/jquery 1.11.3 2.1.4 

Poi, nel tuo js, ​​si può semplicemente require(jquery) e/o require(jqueryOne), se necessario, consentendo di andare avanti e indietro, se necessario.

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

1

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

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

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

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

volevo postare qui per qualcuno come me che sta usando Yarn ed è atterrato qui. Si tratta di una più o meno drop-in sostituzione di NPM che supporta aliasing fuori dalla scatola:

yarn add [email protected] 
yarn add [email protected]:[email protected] 
then 

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

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

+0

Wow, esattamente il pacchetto su cui sto lavorando, Grazie! –

0

NPM installare la versione (https://github.com/scott113341/npm-install-version) è anche un'opzione. Fa essenzialmente ciò che alcune delle altre soluzioni fanno (tecnicamente parlando) ma è abbastanza semplice da usare.I moduli installati con un numero di versione (parametro 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, che è utile con i sistemi di compilazione.

codice d'uso frammento della GitHub Documenti:

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

niv.install('[email protected]'); 
// installs [email protected] to node_modules/[email protected]/ 

niv.install('[email protected]'); 
// installs [email protected] to node_modules/[email protected]/ 

const csjs_old = niv.require('[email protected]'); 
const csjs_new = niv.require('[email protected]'); 
// 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