Как упаковать 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/ в моей среде разработки (где работает модуль) я не могу найти этот файл. Поэтому я предполагаю, что файл НЕ включен в исполняемый файл и что мне нужно сделать что-то, что:

  1. делает pkg включить файл в двоичный файл
  2. Изменяет путь к файлу, чтобы быть путем к файлу в двоичном файле

Как мне сделать это с 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. Вы должны использовать ту же систему, которую будете использовать в выпуске.
Другие вопросы по тегам