wake-up-neo.com

Zwei Versionen desselben NPM-Pakets in der Knotenanwendung

Ich arbeite an einem CLI-Tool in NodeJS, das ein anderes NodeJs-Paket verwendet, das wir entwickeln, ein SDK. 

Die Sache ist, wir haben gerade eine V2-Version dieses SDK veröffentlicht, und wir möchten dem CLI-Benutzer einen Legacy-Modus anbieten, sodass er entweder die erste oder die zweite Version unseres SDK verwenden kann, z.

$ cli do-stuff
#execute sdk v2

Oder

$ LEGACY_MODE='on' cli do-stuff
#execute sdk v1

Mein Problem ist, dass ich keinen sauberen Weg gefunden habe, zwei Versionen derselben Abhängigkeit in meiner CLI zu verwenden ... Ich habe versucht, das Paket npm-install-version zu verwenden. Es funktioniert gut in meiner lokalen Umgebung, aber nachdem ich mein cli veröffentlicht und npm install -g my-cli ausgeführt habe, funktioniert es nicht mehr, da es im aktuellen Ordner einen node_modules -Ordner anstelle des /usr/local/lib/node_modules/my-cli-Ordners ..__ erstellt. Ich habe auch multidep , und ich habe die gleiche Ausgabe.

Im Moment enthält meine package.json meine sdk nicht, aber ich hätte gerne etwas wie:

"dependencies": {
  "my-sdk": "2.0.0"
  "my-sdk-legacy": "1.0.0"
}

Oder

"dependencies": {
  "my-sdk": ["2.0.0", "1.0.0"]
}

Ich habe noch nichts gefunden. Ich denke darüber nach, die erste Version meines sdk-Pakets unter einem anderen Namen wie "my-sdk-legacy" zu veröffentlichen, aber ich möchte das möglichst vermeiden.

Irgendwelche Lösung dafür?

13
Greg

Dies ist also ein ziemlich häufiges Szenario, das mehrmals angesprochen wurde.

Es gibt eine geschlossene Ausgabe für npm und eine offene Ausgabe für Garn Paketmanager.


Die erste Lösung wurde vom Autor von NPM in this GH comment vorgeschlagen: 

Veröffentlichen Sie ein separates Paket unter einem anderen Namen. Es wird eine bestimmte Version benötigt.

{ "name": "express3",
  "version": "1.0.0",
  "description":"Express version 3",
  "dependencies": { "express":"3" } }

// index.js
module.exports = require('express')

In Ihrem Fall veröffentlichen Sie my-sdk-v1 und my-sdk-v2. Ab jetzt können Sie problemlos zwei Versionen eines Pakets in einem Projekt installieren, ohne in Konflikte zu geraten.

const mySDKLegacy = require('my-sdk-v1');
const mySDKModern = require('my-sdk-v2');

Der zweite Weg so ziemlich die gleiche Idee - git url verwenden:

{
    "my-sdk-v1": "git://github.com/user/my-sdk#1.0.0",
    "my-sdk-v2": "git://github.com/user/my-sdk#2.0.0"
}

Im Gegensatz zum npm-Paket können Sie den gewünschten Namen frei wählen! Die Quelle der Wahrheit ist die Git-URL. 

Späternpm-install-version ist aufgetaucht. Buuut, wie Sie bereits bewiesen haben, ist seine Nutzung etwas eingeschränkt. Da ein untergeordneter Prozess erzeugt wird, um einige Befehle auszuführen, und in tmp-Verzeichnisse geschrieben. Nicht der zuverlässigste Weg für eine CLI.

Zusammenfassend: Sie haben die Auswahlmöglichkeiten 1 & 2. Ich würde bei der ersten bleiben, da sich der Name und die Tags des Github-Repos ändern könnten.

Die zweite Option mit git url ist besser, wenn Sie eine Version ändern möchten, um häufiger abhängig zu sein. Stellen Sie sich vor, Sie möchten einen Sicherheitspatch für my-sdk-v1 vererben. Es wird einfacher sein, auf eine git-URL zu verweisen, und veröffentlicht my-sdk-v1.1 immer wieder in npm.

12
Vlad Holubiev

Basierend auf meine Antwort auf eine ähnliche Frage:

Ab npm v6.9. unterstützt npm jetzt Paket-Aliase. Es implementiert die gleiche Syntax wie Yarn verwendet:

npm install [email protected]:[email protected]
npm install my-sdk

Dies fügt package.json Folgendes hinzu:

"dependencies": {
  "my-sdk-legacy": "npm:[email protected]^1.0.0",
  "my-sdk": "2.0.0"
}

Dies scheint mir die eleganteste verfügbare Lösung zu sein und ist mit der von @Aivus vorgeschlagene Garnlösung kompatibel

13
Rens Baardman

Um nur die aktuellen Lösungen zusammenzufassen, können Sie auch Pakete wie folgt bereitstellen:

yarn add [email protected]:my-sdk

oder in package.json

{
  ...
  "my-sdk-newest": "npm:my-sdk",
  "my-sdk": "1.0.0"
  ...
}

wenn Sie sich nur für eine bestimmte ältere Version und die neueste Version interessieren.

1
Aivus