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?

Kennzeichen
quelle
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
Rens Baardman
quelle
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 )

tmahle
quelle
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 [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 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.

JemBijoux
quelle
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');
Jo Liss
quelle
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('[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
SylonZero
quelle
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('[email protected]');
// installs [email protected] to node_modules/[email protected]/

inv.Install('[email protected]');
// installs [email protected] to node_modules/[email protected]/

Beispiel 2: In benutzerdefiniertes Verzeichnis installieren

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

inv.Install('[email protected]', { 'Destination': 'some/path/chalk' });
// installs [email protected] to node_modules/some/path/chalk/

Beispiel 3: Installation mit leiser oder lauter Standardausgabe

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

inv.Install('[email protected]', { 'Verbosity': 'Silent' });
inv.Install('[email protected]', { 'Verbosity': 'Debug' });

Beispiel 4: Überschreiben Sie eine vorhandene Installation

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

inv.Install('[email protected]', { 'Destination': 'mydir' });
// installs [email protected] to node_modules/mydir/

inv.Install('[email protected]', { 'Destination': 'mydir' });
// does not install [email protected] since node_modules/mydir/ already exists

inv.Install('[email protected]', { 'Destination': 'mydir', 'Overwrite': true });
// installs [email protected] to node_modules/mydir/ by overwriting existing install
Scott Lin
quelle
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 [email protected]

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
Stefan Musarra
quelle