Node应用程序中有两个相同的npm包版本

我正在使用NodeJS中的一个CLI工具,它使用我们开发的另一个NodeJs包,它是一个SDK。

问题是,我们刚刚发布了该SDK的V2版本,我们希望为CLI用户提供传统模式,以便他们可以使用SDK的第一个或第二个版本,如下所示:

$ cli do-stuff #execute sdk v2 

要么

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

我的问题是,我没有find任何干净的方式来使用我的CLI中的两个版本的相同的依赖项。 我试图使用npm-install-version软件包。 它适用于我的本地环境,但是在发布我的cli和执行npm install -g my-cli ,它不再工作,因为它在当前文件夹中创build了一个node_modules文件夹,而不是/usr/local/lib/node_modules/my-cli文件夹。 我也试过multidep ,我也有类似的问题。

现在,我的package.json根本不包含我的sdk,但是我想有这样的东西:

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

要么

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

我还没有发现任何其他的东西。 我正在考虑用另一个名字(比如“my-sdk-legacy”)发布我的sdk软件包的第一个版本,但是如果可能的话,我想避免这种情况。

任何解决scheme?

所以这实际上是一个很常见的情况,这个问题已经有好几次了。

npm和纱包pipe理者的公开问题有一个closures的问题。


第一个解决scheme是由NPM的作者在GH评论中提出的:

以不同的名称发布一个单独的包。 它将需要一个特定的版本。

 { "name": "express3", "version": "1.0.0", "description":"Express version 3", "dependencies": { "express":"3" } } // index.js module.exports = require('express') 

在你的情况下,你会发布my-sdk-v1my-sdk-v2 。 从现在开始,您可以在一个项目中轻松安装两个版本的软件包,而不会发生冲突。

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

第二种方式提出了几乎相同的想法 – 使用git url:

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

不像npm包,你可以自由select你想要的任何名字! 真相的来源是git url。

后来 npm-install-versionpopup。 Buuut,你已经certificate,它的使用是有限的。 因为它产生了一个subprocess来执行一些命令并写入到tmp目录。 不是CLI最可靠的方式。

总结一下:你剩下的select1和2.我会坚持第一个,因为github回购名称和标签可能会改变。

第二个选项与git的url是更好的,当你想更改一个版本依赖更频繁。 想象一下你想发布一个my-sdk-v1遗留的安全补丁。 更容易引用一个git url,然后一次又一次地发布my-sdk-v1.1到npm。