Node 应用程序中相同 npm 包的两个版本
Two versions of same npm package in Node application
我正在 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",但我想尽可能避免这种情况。
有什么解决办法吗?
所以这实际上是一个很常见的场景,已经解决了好几次。
npm and open issue for 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-v1
和 my-sdk-v2
。从现在开始,您可以轻松地在一个项目中安装一个包的 2 个版本,而不会 运行 发生冲突。
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 package,你可以自由选择任何你想要的名字!真相的来源是 git url。
Later npm-install-version
弹出。但是,正如您已经证明的那样,它的使用有点受限。因为它产生一个子进程来执行一些命令并写入 tmp 目录。不是 CLI 最可靠的方式。
总结一下:你只剩下选择 1 和 2。我会坚持第一个,因为 github 仓库名称和标签可能会改变。
第二个选项 git url 当你想更频繁地更改版本时更好。假设您想为 my-sdk-v1 legacy 发布一个安全补丁。引用 git url 然后一次又一次地发布 my-sdk-v1.1
到 npm 会更容易。
因此,为了添加到当前的解决方案中,您还可以提供这样的软件包:
yarn add my-sdk-newest@npm:my-sdk
或在package.json
{
...
"my-sdk-newest": "npm:my-sdk",
"my-sdk": "1.0.0"
...
}
如果您只关心特定的旧版本和最新版本。
基于my answer for a similar question:
自 npm v6.9.0, npm now supports package aliases. It 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"
}
在我看来,这是最优雅的解决方案,并且与
兼容
做npm i alias@npm:package_name@package_version
在 package.json 内使用 “alias”: “npm:package_name@package_version”
我需要 运行 两个版本的 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';
我正在 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",但我想尽可能避免这种情况。
有什么解决办法吗?
所以这实际上是一个很常见的场景,已经解决了好几次。
npm and open issue for 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-v1
和 my-sdk-v2
。从现在开始,您可以轻松地在一个项目中安装一个包的 2 个版本,而不会 运行 发生冲突。
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 package,你可以自由选择任何你想要的名字!真相的来源是 git url。
Later npm-install-version
弹出。但是,正如您已经证明的那样,它的使用有点受限。因为它产生一个子进程来执行一些命令并写入 tmp 目录。不是 CLI 最可靠的方式。
总结一下:你只剩下选择 1 和 2。我会坚持第一个,因为 github 仓库名称和标签可能会改变。
第二个选项 git url 当你想更频繁地更改版本时更好。假设您想为 my-sdk-v1 legacy 发布一个安全补丁。引用 git url 然后一次又一次地发布 my-sdk-v1.1
到 npm 会更容易。
因此,为了添加到当前的解决方案中,您还可以提供这样的软件包:
yarn add my-sdk-newest@npm:my-sdk
或在package.json
{
...
"my-sdk-newest": "npm:my-sdk",
"my-sdk": "1.0.0"
...
}
如果您只关心特定的旧版本和最新版本。
基于my answer for a similar question:
自 npm v6.9.0, npm now supports package aliases. It 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"
}
在我看来,这是最优雅的解决方案,并且与
做npm i alias@npm:package_name@package_version
在 package.json 内使用 “alias”: “npm:package_name@package_version”
我需要 运行 两个版本的 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';