npm and nodejs packages - victronenergy/venus GitHub Wiki

This page contains various details on how to handle npm and nodejs recipes, and especially the shrinkwrap file.

It applies to any recipe using the npm-online-install.

How to update npm-shrinkwrap

Here is a copy & paste recipe. Do make sure that patches are applied, in case of signal-server, that is best done by opening packages.json and checking that the venus and ais package are there as mandatory packages.

(the rm -rf ./node_modules is actually not necessary when taking a fresh folder, but nice if you need to do this multiple times somehow)

cd ./build/tmp-glibc/work/ekrano-ve-linux-gnueabi/signalk-server/2.8.3-r0/npm
rm ./npm-shrinkwrap.json
rm -rf ./node_modules
npm install --omit=dev
npm shrinkwrap
cp ./npm-shrinkwrap.json ../../../../../../../sources/meta-victronenergy/meta-third-party/recipes-extended/signalk-server/signalk-server/
cd ../../../../../../../sources/meta-victronenergy/meta-third-party/recipes-extended/signalk-server/signalk-server/

A nice tool to check the up to dateness of all is:

npm outdated

Don't clone from github and go from there!

Beware that cloning the signalk repo from github and then installing and making the npm-shrinkwrap doesn't work and results in issues when building Venus in OE and or only thereafter: signalk-server doesn't run, complaining of missing server-api package and more.

Cloning from github and npm installing results in symlinking to the modules under packages because it uses npm workspaces - mechanism for monorepo = multiple different modules that are interconnected to facilitate developing features that span the sk server proper and the modules it uses

For further info, see also this issue: https://github.com/victronenergy/venus/issues/1298.

how does Venus OS build an npm package?

The npm class in OE was so slow, that we made a new implementation, see here: https://github.com/victronenergy/meta-victronenergy/blob/master/meta-third-party/classes/npm-online-install.bbclass

So, any recipe using that class, is built using the code in that file.

Most important to know, is that this is how its installed:

npm install --arch=xxx --target_arg=xxx --production

That excludes any dev dependencies, and also excludes any optional dependencies.

npm-shrinkwrap.json

Each recipe should contain an npm-shrinkwrap.json.

The purpose of having that is having installable builds. Instead of whenever doing a Venus OS build, having the npm installer take the latest versions of all packages according to limitations defined in the package.json file.

If a recipe doesn't have a npm-shrinkwrap.json file, the Venus OS build will fail with a warning about it being missing.

Some work was done to make that work right, see: