Consider utilizing a postinstall
script in the scripts
section of your projects package.json. For instance:
package.json
"scripts": {
"postinstall": "node install-websocket"
},
As you can see, the postinstall
script invokes a nodejs script, arbitrarily named install-websocket.js
.
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'
});
The install-websocket.js
script essentially performs the following tasks:
Gets the version of node.js using process.version
which returns a string, e.g. v13.10.1
To obtain the Major version from that string (i.e. 13
in that aforementioned example) we use a combination of the replace() and split()
methods.
The conditional (ternary) operator ascertains
which version of websocket
to subsequently install - based on whether the value of nodeMajorVersion
is <= 4
.
Finally we "shell out" the appropriate npm install websocket@x.x.x
command using execSync
.
Note: If you're concerned about execSync
being synchronous, then utilize the asynchronous exec
instead.
Additional Notes:
Given the code shown above it assumes the install-websocket.js
file resides in the root of your project directory, i.e. at the same level as package.json.
my-project
├── package.json
├── install-websocket.js
└── ...
It's important for the install-websocket.js
file to exist at this location for following two reasons:
Primarily, and most importantly, because you'll have noticed that we specify __dirname
for the value of execSync
's cwd
option. The value of __dirname
in this context is the pathame to the parent directory of wherever the install-websocket.js
file resides.
Essentially by setting the cwd
option to this specific pathname, (i.e. the path to the project directory), we ensure that when the npm install websocket@x.x.x
command is run it gets installed in the same location as where your project resides - regardless of whether it's installed locally or globally.
The postinstall
script in package.json expects the install-websocket.js
file to reside there too. Note how it currently runs; node install-websocket
, and doesn't assume the file exists elsewhere, i.e. it's not running something like: node ./some/path/to/install-websocket
If consumers of your package have npm configured to ignore-scripts then websocket
's simply will not be installed because the postinstall
script will not be invoked.