【问题标题】:Install different packages depending on node version根据节点版本安装不同的包
【发布时间】:2020-03-07 15:18:32
【问题描述】:

我有一个依赖于websocket 包的项目。但是,对于节点 10.x,最新版本 (1.0.31) 的 websocket 可以工作,而在节点 4.x 上,版本 10.0.24 可以工作,但 10.0.31 可以不。是否可以为每个 nodejs 版本指定 不同 包(版本)来处理这样的情况,例如像这样

  • node 4.x 及更早版本 -> websockets 1.0.24
  • 所有其他节点版本 -> websockets 1.0.31

最好它应该在 npm 和 yarn 中都可以工作,但如果它只适用于其中任何一个也可以。

node 10 版本用于开发设置,而 node 4.x 用于无法运行 docker 或升级的遗留嵌入式平台。

【问题讨论】:

  • 据我所知,Node 4 或更早版本是否值得支持?节点 10 是仍在获得支持和更新的最古老的节点:nodejs.org/en/about/releases

标签: node.js npm yarnpkg


【解决方案1】:

考虑在您的项目 package.json 的 scripts 部分中使用 postinstall 脚本。例如:

package.json

"scripts": {
  "postinstall": "node install-websocket"
},

如您所见,postinstall 脚本调用了一个 nodejs 脚本,任意命名为install-websocket.js。

安装-websocket.js

const execSync = require('child_process').execSync;

const nodeMajorVersion = process.version.replace(/^v/, '').split('.')[0];
const websocketVersion = nodeMajorVersion <= '4' ? '1.0.24' : '1.0.31';

execSync('npm install websocket@' + websocketVersion, {
    cwd: __dirname,
    stdio: 'inherit'
});

install-websocket.js 脚本主要执行以下任务:

  1. 使用返回字符串的process.version 获取node.js 的版本,例如v13.10.1

    要从该字符串(即上述示例中的 13)获取 Major 版本,我们使用 replace() 和 split() 方法的组合。

  2. conditional (ternary) operator 确定 随后安装哪个版本的websocket - 基于nodeMajorVersion 的值是否为&lt;= 4。

  3. 最后我们“shell out”使用execSync 适当的npm install websocket@x.x.x 命令。

    注意:如果您担心execSync 是同步的,请改用异步exec。


补充说明:

  • 鉴于上面显示的代码,它假定 install-websocket.js 文件位于项目目录的根目录中,即与 package.json 处于同一级别。

    my-project
    ├── package.json
    ├── install-websocket.js
    └── ...
    

    install-websocket.js 文件存在于此位置很重要,原因如下:

    1. 主要也是最重要的,因为您会注意到我们为execSync 的cwd 选项的值指定了__dirname。在此上下文中__dirname 的值是install-websocket.js 文件所在位置的父目录的路径。

      基本上通过将cwd 选项设置为此特定路径名(即项目目录的路径),我们确保在运行npm install websocket@x.x.x 命令时,它会安装在与您的项目所在位置相同的位置 -无论是本地安装还是全局安装。

    2. package.json 中的postinstall 脚本也希望install-websocket.js 文件也驻留在那里。注意它当前的运行方式; node install-websocket,并且不假设该文件存在于其他地方,即它没有运行类似:node ./some/path/to/install-websocket

  • 如果你的包的消费者有 npm configured to ignore-scripts,那么 websocket 将不会被安装,因为 postinstall 脚本不会被调用。

【讨论】:

  • 另外,因为这本质上是 NPM 的一种解决方法(因为需要更好的词),因为 NPM 没有特定的内置功能来根据节点版本安装不同的包,然后是任何报告工具,例如 @ 987654331@ 或 www.npmjs.com 本身不会正式显示/列出 websocket 作为依赖项 - 仅仅是因为它不会列在项目的 package.json 文件中。
猜你喜欢
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2022-12-08
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多