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

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

$ cli do-stuff
#execute sdk v2

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

我的问题是,我没有找到任何干净的方法在CLI中使用同一依赖项的两个版本.

现在,我的Package.json完全不包含我的sdk,但我希望有如下内容:

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

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

我还没找到别的东西.我正在考虑用另一个名字发布我的sdk包的第一个版本,比如"my sdk legacy",但如果可能的话,我希望避免这样做.

有什么解决办法吗?

推荐答案

这实际上是一个非常常见的场景,它被多次提到.

npm名包装经理有一期已发行,yarn名包装经理有一期未发行.


NPM的作者在this GH comments 中提出了第一个解决方案:

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

{ "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');

second way条建议与我们提出的 idea 基本相同——使用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.

Later npm-install-version出现了.Buuut,正如您已经证明的,它的使用有点有限.因为它会产生一个子进程来执行一些命令并写入tmp目录.这不是CLI最可靠的方式.

总而言之:你只有 Select 1&;2.我会坚持第一个,因为github回购名称&;标签可能会改变.

第二个选项是git url,当你想更频繁地更改版本时,它会更好.假设您想为my-sdk-v1 legacy发布一个安全补丁.将更容易引用git url,然后一次又一次地将my-sdk-v1.1发布到npm.

Node.js相关问答推荐

NX无法使用缓存运行根级脚本

GraphQL MongoDB Mongoose填充字段未获取多个类别

如果非SQL函数在事务内部运行失败,PG-Promise事务会回滚吗?

获取驱动器文件夹的直接子文件夹时出现问题

函数声明中的异步在没有等待的函数中做什么?

如何在nodejs中打印pdf

MongoDB - 查找查询以判断是否存在少量字段,结合字段上的 AND

在 Node JS 中使用 url 链接而不是文件路径

Express.js - 监听请求中止

如何防止 node.js 中的内存泄漏?

通过 npm 导入 Sass

您如何写入 aws lambda 实例的文件系统?

在本地运行 Cloud Functions 会出现错误functions.config() 不可用

eslint - vscode 的可选链接错误

用于排除多个文件的 node.js glob 模式

具有多个条件的mongoose 查找

如何在 Node.js 中等待子进程完成

如何brew安装特定版本的Node?

Node.js, require.main === 模块

为什么 Node.js 没有原生 DOM?