web-dev-qa-db-fra.com

Deux versions du même paquet npm dans l'application Node

Je travaille sur un outil CLI dans NodeJS qui utilise un autre package NodeJs que nous développons, qui est un SDK. 

Le fait est que nous venons de publier une version V2 de ce SDK et que nous souhaitons offrir à l'utilisateur CLI un mode hérité afin qu'il puisse utiliser la première ou la deuxième version de notre SDK, comme suit:

$ cli do-stuff
#execute sdk v2

Ou

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

Mon problème est que je n'ai trouvé aucun moyen propre d'utiliser deux versions de la même dépendance dans mon CLI . J'ai essayé d'utiliser npm-install-version package. Cela fonctionne bien dans mon environnement local, mais après la publication de mon cli et l'exécution de npm install -g my-cli, cela ne fonctionne plus car il crée un dossier node_modules dans le dossier actuel au lieu du dossier /usr/local/lib/node_modules/my-cli . J'ai aussi essayé multidep , et j'ai un peu le même problème.

Pour l'instant, mon package.json ne contient pas du tout mon sdk, mais j'aimerais avoir quelque chose comme:

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

Ou

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

Je n'ai encore rien trouvé. Je pense à publier la première version de mon paquet sdk sous un autre nom, comme "my-sdk-legacy", mais j'aimerais éviter cela si possible.

Une solution pour ça?

13
Greg

Il s’agit donc d’un scénario assez courant qui a été traité à plusieurs reprises.

Il existe un problème fermé pour npm et un numéro ouvert pour fil gestionnaires de paquets.


La première solution a été suggérée par l’auteur de NPM dans this GH commentaire: 

Publier un package distinct sous un nom différent. Il faudra une version spécifique à l'intérieur.

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

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

Dans votre cas, vous publierez my-sdk-v1 et my-sdk-v2. Et à partir de maintenant, vous pouvez facilement installer 2 versions d’un paquet dans un projet sans vous heurter à des conflits.

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

La deuxième manière à peu près la même idée proposée - utilisez l’URL git:

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

Contrairement au paquet npm, vous êtes libre de choisir le nom de votre choix! L'URL GIT est la source de la vérité. 

Plus tardnpm-install-version est apparu. Buuut, comme vous l'avez déjà prouvé, son utilisation est un peu limitée. Puisqu'il génère un processus enfant pour exécuter certaines commandes et écrit dans les répertoires tmp. Pas le moyen le plus fiable pour un CLI.

Pour résumer: il ne vous reste que les choix 1 et 2. Je m'en tiendrai au premier, car le nom et les balises github repo pourraient changer.

La deuxième option avec l'URL git est préférable lorsque vous souhaitez modifier une version plus fréquemment. Imaginez que vous souhaitiez publier un correctif de sécurité pour my-sdk-v1 legacy. Sera plus facile de référencer une URL git puis publier my-sdk-v1.1 dans npm encore et encore.

12
Vlad Holubiev

Donc, pour ajouter aux solutions actuelles, vous pouvez également fournir des packages tels que

yarn add my-sdk-newest@npm:my-sdk

ou en package.json

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

si vous vous souciez de la version la plus récente et la plus récente.

1
Aivus