Я пытаюсь использовать пакет узла tree-sitter в своем расширении vscode, но получаю следующую ошибку:
Activating extension 'extension name' failed: The module '.../node_modules/tree-sitter/build/Release/tree_sitter_runtime_binding.node' was compiled against a different Node.js version using NODE_MODULE_VERSION 93. This version of Node.js requires NODE_MODULE_VERSION 89. Please try re-compiling or re-installing the module (for instance, using
npm rebuild
ornpm install
)..
Насколько я понимаю, NODE_MODULE_VERSION — это версия ABI узла. Однако я даже не смог найти выпуск узла с NODE_MODULE_VERSION 89 в файле Официальный сайт.
npm rebuild tree-sitter --update-binary
из верхнего каталога.node-gyp rebuild
и node-gyp rebuild --target=(my node version)
из каталога node_modules/tree-sitter
.Ничего из этого не помогло. Из здесь я понял, что изменение версии узла не поможет, как я подтвердил, когда пытался
console.info(process.version); // v14.16.0
console.info(process.versions.modules); // 89
Это дало один и тот же результат независимо от того, какую версию узла я использовал. Я также пытался пересобрать пакет tree-sitter, используя эту версию узла node-gyp rebuild --target=14.16.0
, но получаю ту же ошибку, однако на этот раз он говорит, что модуль был скомпилирован с использованием NODE_MODULE_VERSION 83, что согласуется с тем, что написано на сайте узла.
Как устранить эту ошибку? Любая помощь приветствуется.
Как я и подозревал, версия ABI узла, используемая расширениями vscode, — это версия ABI, используемая внутренним электроном vscode. Согласно этому источнику
Native Node.js modules are supported by Electron, but since Electron has a different application binary interface (ABI) from a given Node.js binary (due to differences such as using Chromium's BoringSSL instead of OpenSSL), the native modules you use will need to be recompiled for Electron...
Это объясняет, почему я не смог найти NODE_MODULE_VERSION 89 на сайте узла.
Затем я проверил, какую версию электрона использует моя сборка vscode. Для этого я просто проверил package.json, который шел с vscode (/usr/lib/code/package.json
в linux, я думаю, что он находится внутри папки, в которой vscode установлен на windows).
Далее, следуя инструкциям с сайта электрона, пересоберите модуль с помощью пакета electron-rebuild
. Чтобы указать целевую версию, просто запустите
./node_modules/.bin/electron-rebuild -v [version]
Однако у меня нет источника для этого, но кажется, что tree-sitter в настоящее время не поддерживает более новые версии электрона, поэтому сборка завершается ошибкой. Похоже, это связано с изменением API V8 (согласно этому).
Автор связал свое решение здесь. Я скопировал его изменения, и сборка прошла успешно.
Обратите внимание, что мне пришлось заменить существующий аддон узла новым.