Search code examples
sqlitevisual-studio-codeelectronnode-sqlite3

How to tell Visual Studio Code compiled from source where to find sqlite module?


I am building the Visual Studio Code from the source checked out from the git repository:

git clone https://github.com/microsoft/vscode 

I am building using:

export NODE_OPTIONS=--max_old_space_size=2048 
./scripts/npm.sh install  --arch=armhf 
./scripts/code.sh 

I am using node 10.16.3 on a Raspberry PI 4, using Raspbian buster

There were no errors during build.

The installation downloads a precompiled version of electron on the first run.

However each time I try and run code, it starts but with an error:

[storage state.vscdb] open(): Unable to open DB due to Error: Cannot find module '../build/Release/sqlite

If I look in node_modules/vscode-sqlite3/build/Release/

I can see:

sqlite3.a sqlite.a

It is unclear to me why electron/vscode cannot find this library. I would be greatful for any pointers on how to tell the runtime where to look for the modules.


Solution

  • On inspecting the build scripts and after many painful experiments, I've found and solved the 2 problems leading to this error.

    1. The fact that .a static libraries are left behind hinted that some settings in the binding.gyp, config.gpy and/or makefiles are wrong, as Native Node Modules are normally dynamic libraries with an .node extension. One conditional line in the binding.gyp file under vscode-sqlite3 seems to the the culprit: ... ["target_arch=='arm'", {"type": "static_library"}] ...

    Disable that line (by removing it or changing 'arm' to something else) and then run:

    node-gyp configure
    

    to regenerate the config.gpy file(s) under the build directory. Then build the module with:

    node-gyp build
    

    A sqlite.node will be generated in build/Release.

    1. Unfortunately, the latest electron ABI version rarely matches that of the Node.js version. In my configuration, the electron ABI version is 72 (v6.0.12) but the latest stable Node version is for ABI 64. Therefore we have to do an electron-rebuild to update the sqlite.node to match the electron version.

    To do this, you would have to first install electron-rebuild (yarn add electron-rebuild) then run electron-rebuild by giving supplying explicitly the version number of the electron binary that vscode downloaded:

    electron-rebuild -v 6.0.12 -m /home/dev/vscode -o vscode-sqlite3
    

    Of course you would have to state the version number of your particular version of electron you are building for. (Please look up electron-rebuild --help for the meaning of the options. It takes a while to rebuild the binary module...)

    The resulting sqlite.node can then be moved into the build/Release/. directory under the vscode project directory. Voila, we have a working latest version VS-Code for Raspbian!