我有一个依赖于websocket软件包的项目。但是,对于节点10.x,可以使用websocket的最新版本(1.0.31),而在节点4.x上可以使用10.0.24版本,但10.0.31不能 。是否可以为每个nodejs版本指定不同包(版本)来处理此类情况,例如像这样
最好在npm和yarn上都可以使用,但是如果只在两种情况下都可以使用。
节点10版本用于开发设置,而节点4.x用于无法运行docker或无法升级的旧式嵌入式平台。
答案 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
脚本实质上执行以下任务:
使用process.version
获取node.js的版本,该版本返回一个字符串,例如v13.10.1
要从该字符串(即上述示例中的13
)获得 Major 版本,我们使用replace()和split()
方法的组合。 / p>
conditional (ternary) operator确定
后续要安装哪个版本的websocket
-基于nodeMajorVersion
的值是否为<= 4
。
最后,我们使用execSync
“掏空” 适当的npm install websocket@x.x.x
命令。
注意:如果您担心execSync
是同步的,请改用异步exec
。
鉴于上面显示的代码,它假定install-websocket.js
文件位于项目目录的根目录中,即与 package.json 处于同一级别。
my-project
├── package.json
├── install-websocket.js
└── ...
由于以下两个原因,install-websocket.js
文件位于此位置很重要:
最重要的是,因为您会注意到我们为execSync
的{{3}}选项的值指定了__dirname
。在这种情况下,__dirname
的值是install-websocket.js
文件所在的父目录的路径。
基本上,通过将cwd
选项设置为此特定路径名(即项目目录的路径),我们可以确保在运行npm install websocket@x.x.x
命令时,将其安装在与您的项目位于-不论是在本地还是全局安装。
package.json 中的postinstall
脚本也希望install-websocket.js
文件也驻留在那里。注意它当前的运行方式。 node install-websocket
,并且不假设该文件存在于其他位置,即该文件未运行类似以下内容的文件:node ./some/path/to/install-websocket
如果软件包的使用者使用npm cwd
,则将不会安装websocket
,因为不会调用postinstall
脚本。