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

时间:2017-05-03 21:30:02

标签: node.js npm npm-install

我正在使用NodeJS中的CLI工具,该工具使用我们开发的另一个NodeJs软件包,即SDK。

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

$ cli do-stuff
#execute sdk v2

或者

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

我的问题是我没有找到任何干净的方法在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"
}

或者

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

我还没找到别的东西。我正在考虑使用其他名称发布我的sdk软件包的第一个版本,例如" my-sdk-legacy",但如果可能,我想避免这样做。

任何解决方案?

5 个答案:

答案 0 :(得分:17)

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

npm已解决的问题以及yarn软件包管理器的未解决问题。

NPM的作者在this 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');

提出的second way几乎相同的想法 - 使用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包不同,您可以自由选择任何您想要的名称!真相的来源是git网址。

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

总结一下:你选择1&我坚持使用第一个,因为github repo name&标签可能会改变。

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

答案 1 :(得分:6)

基于my answer for a similar question:

npm v6.9.0,起,npm现在支持程序包别名。 implements the same syntax是Yarn所使用的:

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

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

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

在我看来,这是目前最优雅的解决方案,并且与Yarn solution proposed by @Aivus.

兼容

答案 2 :(得分:4)

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

yarn add my-sdk-newest@npm:my-sdk

或在package.json

{
  ...
  "my-sdk-newest": "npm:my-sdk",
  "my-sdk": "1.0.0"
  ...
}

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

答案 3 :(得分:1)

执行npm i alias@npm:package_name@package_version

在package.json内部使用“alias”: “npm:package_name@package_version”

答案 4 :(得分:0)

我需要运行tfjs-core的两个版本,发现两个版本都需要在安装后进行构建。

package.json:

"dependencies": {
  "tfjs-core-0.14.3": "git://github.com/tensorflow/tfjs-core#bb0a830b3bda1461327f083ceb3f889117209db2",
  "tfjs-core-1.1.0": "git://github.com/tensorflow/tfjs-core#220660ed8b9a252f9d0847a4f4e3c76ba5188669"
}

然后:

cd node_modules/tfjs-core-0.14.3 && yarn install && yarn build-npm && cd ../../
cd node_modules/tfjs-core-1.1.0  && yarn install && yarn build-npm && cd ../../

最后,要使用这些库:

import * as tf0143 from '../node_modules/tfjs-core-0.14.3/dist/tf-core.min.js';
import * as tf110  from '../node_modules/tfjs-core-1.1.0/dist/tf-core.min.js';