2014-10-16 7 views
22

Aufgrund von https://github.com/npm/npm/issues/2943 wird npm niemals die Möglichkeit unterstützen, Pakete zu aliasieren und mehrere Versionen desselben Pakets zu installieren.Wie installiert man mehrere Paketversionen mit npm

Die im github-Problem enthaltenen Problemumgehungen funktionieren möglicherweise für pure-JS-Module. Da npm jedoch zum Standard für die Front-End-Paketverwaltung wird, enthalten Pakete jetzt verschiedene Assets wie CSS.

Gibt es eine Abhilfe mehrere Versionen des gleichen Pakets zu installieren?

Die beste Idee, die ich mir ausgedacht habe, ist ein Paket zu "klonen" und es mit einem etwas anderen Namen zu veröffentlichen.

Zum Beispiel, wenn Sie mehrere Versionen von jquery benötigen, könnten Sie nur Pakete jquery-alias1, jquery-alias2, jquery-alias3 usw. genannt veröffentlichen, und legen Sie dann die entsprechenden Versionen in Ihrer package.json.

Oder Sie könnten die Pakete entsprechend ihrer Versionsnummer nennen, zB jquery-1.11.x, jquery-2.1.x, etc ..

Beide Ansätze scheinen jedoch schlampig. Gibt es bessere?

+0

ist nicht das Standard-Frontend in Paketverwaltung Bower, die kann [dies ganz einfach] (http://stackoverflow.com/questions/16442012/ bower-install-2-versions-of-jquery). – laggingreflex

+0

Yes Bower scheint hier eine Alternative zu sein. Es ist schade, dass es keine npm-Lösung zu geben scheint, da die Einführung eines anderen Paketverwaltungssystems für ein großes Team schwierig sein kann. Vor allem, wenn Sie bereits eine Infrastruktur eingerichtet haben, um npm zu unterstützen (zB einen privaten npm Registry Server) – mark

Antwort

4

Es ist wie „JSPM“ klingt vielleicht genau das Werkzeug nach dem Sie suchen. JSPM baut auf der NPM sondern ermöglicht es Ihnen, Pakete aus mehreren Quellen zu ziehen (Github, npm, etc). Es nutzt die System.js Universalmodul Loader auf dem Frontend für das Laden von Modulen und „verwendet flache Versionsverwaltung in Version-suffixed Ordner herunterladen“, die einfach an die Vernunft über.

jspm.io

Wenn Sie ein Paket mit installieren jspm Sie dieses Paket zu einem bestimmten Namen Alias ​​können, die Sie später require speziell in Ihrer Module.

$ 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 

Dann in Ihrem js, können Sie einfach require(jquery) und/oder require(jqueryOne) wie nötig, so dass Sie hin und her wie nötig gehen.

Dies gilt auch für jedes Paket, das Sie mehrere Versionen verwenden möchten.

1

Dies ist ziemlich schwierig sauber zu machen, aufgrund der Art, wie npm funktioniert, so würde ich vermeiden, es in der Produktion zu tun.

jedoch für Integrationstests und ähnliche Anwendungsfälle, habe ich ein Paket namens multidep, die mehrere Versionen des gleichen Pakets und require sie wie so installieren lässt:

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

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

Ich wollte hier posten für jemand wie mir, der mit Yarn und landete hier. Es ist ein mehr oder weniger Drop-in-Ersatz für NPM, die aus dem Kasten heraus Aliasing unterstützt:

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 

(Kredit zum Beispiel geht an https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601)

+0

Wow, genau das Paket, an dem ich arbeite, Big Thanks! –

0

NPM installiert Version (https://github.com/scott113341/npm-install-version) ist auch eine Option. Es tut im Wesentlichen, was einige der anderen Lösungen hier tun (technisch gesehen), ist aber ganz einfach zu bedienen.Module, die mit einer Versionsnummer (Standard @version-Befehlsparameter von NPM) installiert wurden, werden in einem Unterordner unter node_modules mit diesem Namen installiert. Sie können auch das Zielverzeichnis pro Modul steuern - was bei Build-Systemen nützlich ist.

Usage Code-Schnipsel aus dem GitHub Docs:

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