Как упаковать sqlite3 в исполняемые пакеты node.js?
Я хочу использовать простую базу данных в скомпилированном приложении node.js. Возможно ли это без установки базы данных отдельно? т.е. я хочу, чтобы база данных была включена в файл.exe, чтобы я мог просто скопировать и выполнить этот файл.
я использую pkg
создавать.exe-файлы, и это работает хорошо, но когда я использую модуль sqlite3 npm,.exe-ошибки при попытке выполнить со следующим предупреждением:
pkg/prelude/bootstrap.js:1155
throw error;
^
Error: Cannot find module 'C:\snapshot\sqlite\node_modules\sqlite3\lib\binding\node-v51-win32-x64\node_sqlite3.node'
1) If you want to compile the package/file into executable, please pay attention to compilation warnings and specify a literal in 'require' call. 2) If you don't want to compile the package/file into executable and want to 'require' it from filesystem (likely plugin), specify an absolute path in 'require' call using process.cwd() or process.execPath.
at Function.Module._resolveFilename (module.js:470:15)
at Function.Module._resolveFilename (pkg/prelude/bootstrap.js:1252:46)
at Function.Module._load (module.js:418:25)
at Module.require (module.js:498:17)
at Module.require (pkg/prelude/bootstrap.js:1136:31)
at require (internal/module.js:20:19)
at Object.<anonymous> (C:\snapshot\sqlite\node_modules\sqlite3\lib\sqlite3.js:4:15)
at Module._compile (pkg/prelude/bootstrap.js:1226:22)
at Object.Module._extensions..js (module.js:580:10)
at Module.load (module.js:488:32)
Это похоже на ошибку sqlite3, которая была исправлена здесь: https://github.com/zeit/pkg/issues/183 (поскольку ошибка была исправлена, я предполагаю, что это проблема пользователя)
Глядя на сообщение об ошибке, выглядит ...../bide_sqlit3.node
файл не найден И глядя на node_modules/
в моей среде разработки (где работает модуль) я не могу найти этот файл. Поэтому я предполагаю, что файл НЕ включен в исполняемый файл и что мне нужно сделать что-то, что:
- делает
pkg
включить файл в двоичный файл - Изменяет путь к файлу, чтобы быть путем к файлу в двоичном файле
Как мне сделать это с zeit/pkg
? или, если это более правильно: как заставить npm установить двоичные файлы в node_modules, а затем ссылаться на эти двоичные файлы?
3 ответа
Вы должны поместить собранный узел-sqlite3.node в тот же каталог, что и двоичный файл, созданный вами с помощью pkg (как указано в этом выпуске). Этот файл можно найти в вашем node_modules/sqlite3/lib/binding/node-vxx-xxxxx-xxx/node_sqlite3.node.
Вам также необходимо убедиться, что вы строите свой проект с помощью pkg с той же версией узла, с которой вы создали sqlite3.
Просто добавьте это в свой package.json:
"pkg": {
"assets": ["node_modules/sqlite3/lib/bindings"]
}
Вот мое полное решение gitlab ci для сред Linux:
Мойpackage.json
есть этот раздел:
"bin": "src/app.js",
"pkg": {
"targets": [
"node16-linux-x64"
],
"assets": [
"node_modules/sqlite3/lib/binding/napi-v6-linux-glibc-x64/node_sqlite3.node"
],
"outputPath": "./"
}
Мой конвейер gitlab ci:
variables:
GIT_DEPTH: 1
APT_CACHE_DIR: .aptcache/
YARN_CACHE_DIR: .yarn-cache/
PKG_CACHE_DIR: .pkg-cache/
build-deploy:
image: node:16.13-slim
cache:
key: backend
paths:
- node_modules
- $APT_CACHE_DIR
- $YARN_CACHE_DIR
- $PKG_CACHE_DIR
before_script:
- rm -f /etc/apt/apt.conf.d/docker-clean
- mkdir -pv $APT_CACHE_DIR $YARN_CACHE_DIR $PKG_CACHE_DIR && mkdir /var/cache/apt/archives && mount --bind $APT_CACHE_DIR /var/cache/apt/archives/
- apt update -y && apt upgrade -y
- apt install rsync openssh-client sqlite3 -y
- node -v && yarn -v
- yarn install --cache-folder $YARN_CACHE_DIR
script:
- PKG_CACHE_PATH=$PKG_CACHE_DIR node_modules/.bin/pkg package.json
# deploy via rsync
Пожалуйста, обрати внимание:
- вам нужен пакет в вашей системе сборки, иначе у вас не будет необходимой привязки под
node_modules/sqlite3/lib/binding/
. Здесь вы можете видеть, что я устанавливаюsqlite3
пакет в моей системе Debian. - если вы будете использовать Alpine Linux, а затем развернуть его в среде выпуска Debian\ubuntu\gentoo, это не сработает, поскольку используется Alpine.
musl
и большинство других Linux-систем используютglibc
. Вы должны использовать ту же систему, которую будете использовать в выпуске.