Two versions of same npm package in Node application

Greg picture Greg · May 3, 2017 · Viewed 23.6k times · Source

I'm working on a CLI tool in NodeJS that uses another NodeJs package that we develop, which is an SDK.

The thing is, we just published a V2 version of that SDK, and we want to offer the CLI user a legacy mode, so they can use either the first or second version of our SDK, like so:

$ cli do-stuff
#execute sdk v2

Or

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

My problem is that I did not found any clean way to use two versions of the same dependency in my CLI. I tried to use npm-install-version package. It works well on my local environment, but after publishing my cli and doing npm install -g my-cli, it doesn't work anymore, because it creates a node_modules folder in the current folder, instead of the /usr/local/lib/node_modules/my-cli folder. I also tried multidep, and I have kind of the same issue.

For now, my package.json do not contain at all my sdk, but I would like to have something like :

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

Or

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

I haven't found anything else yet. I'm thinking about publishing the first version of my sdk package with another name, like "my-sdk-legacy", but I would like to avoid that if possible.

Any solution for that ?

Answer

Rens Baardman picture Rens Baardman · Jun 7, 2019

Based on my answer for a similar question:

As of npm v6.9.0, npm now supports package aliases. It implements the same syntax as Yarn uses:

npm install my-sdk-legacy@npm:my-sdk@1
npm install my-sdk

This adds the following to package.json:

"dependencies": {
  "my-sdk-legacy": "npm:my-sdk@^1.0.0",
  "my-sdk": "2.0.0"
}

This seems to me the most elegant solution available, and is compatible with the Yarn solution proposed by @Aivus.