根据节点版本安装不同的软件包

时间:2020-03-07 15:18:32

标签: node.js npm yarnpkg

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

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

最好在npm和yarn上都可以使用,但是如果只在两种情况下都可以使用。

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

1 个答案:

答案 0 :(得分:1)

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

package.json

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

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

install-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()方法的组合。 / p>

  2. conditional (ternary) operator确定 后续要安装哪个版本的websocket-基于nodeMajorVersion的值是否为<= 4

  3. 最后,我们使用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的{​​{3}}选项的值指定了__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 cwd,则将不会安装websocket,因为不会调用postinstall脚本。

    li>