So installieren Sie mehrere Paketversionen mit npm


94

Aufgrund von https://github.com/npm/npm/issues/2943 unterstützt npm niemals die Möglichkeit, Pakete zu aliasen und mehrere Versionen desselben Pakets zu installieren.

Die im Github-Problem veröffentlichten Problemumgehungen funktionieren möglicherweise für reine JS-Module. Da npm jedoch zum Standard für die Verwaltung von Frontend-Paketen wird, enthalten Pakete jetzt verschiedene Elemente wie CSS.

Gibt es eine Problemumgehung, um mehrere Versionen desselben Pakets zu installieren?

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

Zum Beispiel, wenn Sie mehrere Versionen benötigen jquery, könnten Sie nur Pakete genannt veröffentlichen jquery-alias1, jquery-alias2, jquery-alias3etc, und dann die entsprechenden Versionen in Ihrem gesetzt package.json.

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

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


Ist nicht der Standard in der Frontend-Paketverwaltung, der dies leicht tun kann .
Laggingreflex

Ja, Laube scheint hier eine Alternative zu sein. Es ist schade, dass es keine npm-Lösung zu geben scheint, da es schwierig sein kann, einem großen Team ein anderes Paketverwaltungssystem vorzustellen. Vor allem, wenn Sie bereits eine Infrastruktur zur Unterstützung von npm eingerichtet haben (z. B. einen privaten npm-Registrierungsserver)
markieren Sie den

Antworten:


95

Ab npm v6.9.0 unterstützt npm jetzt Paketaliasnamen . Es implementiert dieselbe Syntax wie Yarn:

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

Dies fügt Folgendes hinzu package.json:

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

Mit dieser Syntax kann auch direkt von Github aus installiert werden. Wenn Sie beispielsweise sowohl die npm-Registrierungsversion als auch einen Github-Fork des Pakets installieren möchten foobar:

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

Garn unterstützt auch Paket-Aliasing
Greg K

Hallo, ich habe diesen Schritt versucht, um 2 Paket zu installieren: "React-Native-Track-Player": "1.1.4" und "React-Native-Track-Player": "1.1.8". Es funktioniert gut unter iOS, aber unter Android wird der Fehler angezeigt, dass "MusicManager $ 1 mehrfach definiert ist". Wie kann ich verhindern, dass Android 1.1.8 erstellt?
EmBeCoRau

Aufgrund einiger Konflikte in der Bibliothek muss ich 1.1.8 unter iOS und 1.1.4 unter Android verwenden
EmBeCoRau

Hat bei mir nicht funktioniert, da sich der Alias ​​der Abhängigkeit von dem unterschied, wonach gesucht wurde, dh gesucht wurde eslint, aber nicht wusste, dass er jetzt benannt wurdeeslint6
Crimbo

74

Ich wollte hier für jemanden wie mich posten, der Garn verwendet und hier gelandet ist. Es ist ein mehr oder weniger Drop-In-Ersatz für NPM, der sofort einsatzbereites Aliasing unterstützt:

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

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


16
Danke dir. Nur um zu verdeutlichen, dass die generische Formel lautet <alternative-name>@npm:<package-name>@<version>
NikosKeyz

5

Es klingt so, als ob "JSPM" genau das Werkzeug ist, nach dem Sie suchen. JSPM baut auf NPM auf, ermöglicht es Ihnen jedoch, Pakete aus mehreren Quellen (github, npm usw.) abzurufen. Es verwendet den universellen Modullader System.js am Frontend zum Laden von Modulen und "verwendet die flache Versionsverwaltung zum Herunterladen in Ordner mit Versionssuffix", über die leicht nachzudenken ist.

jspm.io

Wenn Sie ein Paket mit jspm installieren, können Sie dieses Paket auf einen bestimmten Namen aliasen, den Sie später requirespeziell in Ihren Modulen verwenden können.

$ 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

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

Dies gilt auch für alle Pakete, von denen Sie mehrere Versionen verwenden möchten.


2

Dies ist aufgrund der Funktionsweise von npm ziemlich schwierig sauber zu machen, daher würde ich vermeiden, es in der Produktion zu versuchen.

Doch für die Integrationstests und ähnliche Anwendungsfälle, habe ich ein Paket namens multidep , die mehrere Versionen des gleichen Pakets und installieren können requiresie gerne so:

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

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

0

Die NPM-Installationsversion ( https://github.com/scott113341/npm-install-version ) ist ebenfalls eine Option. Es macht im Wesentlichen das, was einige der anderen Lösungen hier tun (technisch gesehen), ist aber recht einfach zu verwenden. Module, die mit einer Versionsnummer installiert sind (von NPM verwendeter Standardbefehlsparameter @version), werden voraussichtlich in einem Unterordner unter node_modules mit diesem Namen installiert . Sie können auch das Zielverzeichnis pro Modul steuern - was bei Buildsystemen hilfreich ist.

Verwendungscode-Snippet aus den GitHub-Dokumenten:

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 ) ist eine weitere Option. Es kann in der Befehlszeile oder über eine programmgesteuerte Oberfläche verwendet werden - geschrieben in TypeScript für die moderne Entwicklung.

Beispiel 1: Installation in ein versioniertes (Standard-) Verzeichnis

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/

Beispiel 2: In benutzerdefiniertes Verzeichnis installieren

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/

Beispiel 3: Installation mit leiser oder lauter Standardausgabe

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

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

Beispiel 4: Überschreiben Sie eine vorhandene Installation

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

In meinem Fall musste ich eine ältere Version von create-react-app installieren als die Version, die ich global installiert hatte, da ich einen Kurs belegte, für den diese ältere Version für die Aufgaben erforderlich war.

Ich habe einen neuen Ordner erstellt, um diese ältere Version zu enthalten, habe eine CD hineingelegt und eine erstellt

npm init

Nachdem ich diese Shell package.json eingerichtet hatte, installierte ich genau die Version der create-react-app, die ich brauchte

npm install create-react-app@1.5.2

Dadurch wurde ein lokaler Ordner node_modules mit der älteren Version von create-react-app erstellt.

Dann habe ich ein einfaches Bash-Skript (create-react-app.sh) als Verknüpfung zu dieser älteren Version erstellt und die Bash-Variable "$ @" verwendet, um alle Argumente weiterzuleiten:

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

Schließlich habe ich dieses einfache Bash-Skript ausführbar gemacht

chmod u+x create-react-app.sh

Wenn Sie dieses Bash-Skript direkt ausführen, wird die ältere Version der create-react-app ausgeführt:

./create-react-app.sh  --version
1.5.2
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.