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

Gre*_*reg 26 node.js npm npm-install

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

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

$ cli do-stuff
#execute sdk v2
Run Code Online (Sandbox Code Playgroud)

要么

$ LEGACY_MODE='on' cli do-stuff
#execute sdk v1
Run Code Online (Sandbox Code Playgroud)

我的问题是我没有找到任何干净的方法在我的CLI中使用相同依赖的两个版本.我试着使用npm-install-version包.它在我的本地环境中运行良好,但在发布我的cli并执行后npm install -g my-cli,它不再起作用,因为它在当前文件夹而不是文件夹中创建了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"
}
Run Code Online (Sandbox Code Playgroud)

要么

"dependencies": {
  "my-sdk": ["2.0.0", "1.0.0"]
}
Run Code Online (Sandbox Code Playgroud)

我还没有找到任何其他东西.我正在考虑使用其他名称发布我的sdk软件包的第一个版本,例如"my-sdk-legacy",但我想尽可能避免这种情况.

任何解决方案?

Vla*_*iev 23

所以这实际上是一个很常见的场景,已经多次解决了.

针对纱线包经理的npm和未解决问题存在封闭问题.


第一个解决方案建议通过NPM在笔者 GH评论:

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

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

// index.js
module.exports = require('express')
Run Code Online (Sandbox Code Playgroud)

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

const mySDKLegacy = require('my-sdk-v1');
const mySDKModern = require('my-sdk-v2');
Run Code Online (Sandbox Code Playgroud)

第二种方式几乎相同的想法建议-使用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"
}
Run Code Online (Sandbox Code Playgroud)

与npm包不同,您可以自由选择任何您想要的名称!真相的来源是git网址.

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

总结一下:你留下了选择1和2.我坚持使用第一个,因为github repo名称和标签可能会改变.

当您想要更改版本以更频繁地依赖时,使用git url的第二个选项会更好.想象一下,您想要发布my-sdk-v1遗产的安全补丁.将更容易引用git url然后my-sdk-v1.1一次又一次地发布到npm.

  • 我尝试了第二个版本,但问题是,npm在git结账后不重命名该文件夹.在```node_modules```文件夹中,只有一个名为"my-sdk"的文件夹.所以下面的代码也不起作用```require('my-sdk-v1');```但我能做```require('my-sdk');```所以我想我'我会坚持第一个版本,即使它对我来说不太方便.谢谢 (6认同)

Ren*_*man 21

根据我对类似问题的回答:

npm v6.9.0开始, npm现在支持软件包别名。它实现了与 Yarn 相同的语法

npm install my-sdk-legacy@npm:my-sdk@1
npm install my-sdk
Run Code Online (Sandbox Code Playgroud)

这会将以下内容添加到package.json

"dependencies": {
  "my-sdk-legacy": "npm:my-sdk@^1.0.0",
  "my-sdk": "2.0.0"
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这是最优雅的解决方案,并且与@Aivus提出Yarn解决方案兼容

  • 这应该是批准的答案 (3认同)

Aiv*_*vus 7

因此,要添加最新的解决方案,您还可以提供以下软件包:

yarn add my-sdk-newest@npm:my-sdk
Run Code Online (Sandbox Code Playgroud)

或在 package.json

{
  ...
  "my-sdk-newest": "npm:my-sdk",
  "my-sdk": "1.0.0"
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果您只关心特定的旧版本和最新版本。


Rit*_*pta 5

npm i alias@npm:package_name@package_version

在 package.json 里面使用 “alias”: “npm:package_name@package_version”