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?
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.
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
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.