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-v1
和my-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-version
popup。 Buuut,你已经certificate,它的使用是有限的。 因为它产生了一个subprocess来执行一些命令并写入到tmp目录。 不是CLI最可靠的方式。
总结一下:你剩下的select1和2.我会坚持第一个,因为github回购名称和标签可能会改变。
第二个选项与git的url是更好的,当你想更改一个版本依赖更频繁。 想象一下你想发布一个my-sdk-v1遗留的安全补丁。 更容易引用一个git url,然后一次又一次地发布my-sdk-v1.1
到npm。