如何在Node.js可执行程序中打包sqlite3?

7
我希望在编译后的node.js应用程序中使用一个简单的数据库,是否可以不单独安装数据库?即我希望将数据库包含在.exe文件中,以便我只需复制和执行该文件。
我正在使用pkg创建.exe文件,并且它运行良好,但当我使用npm模块sqlite3时,.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 bug: https://github.com/zeit/pkg/issues/183 (因为bug已被修复,我认为这是用户问题)

根据错误信息来看,似乎找不到...../bide_sqlit3.node文件。在我的开发环境中查看node_modules/(模块正常工作的地方),我找不到那个文件。因此我假设该文件未被包含在可执行文件中,而我需要做一些事情:

  1. pkg将该文件包含在二进制文件中
  2. 修改文件路径以使其成为二进制文件中文件的路径

如何使用zeit/pkg实现这一点?或者,如果这更正确:如何强制npm将二进制文件安装到node_modules,然后引用这些二进制文件?


你解决了这个问题吗? - lukassz
我不记得了...抱歉。 - Zach Smith
3个回答

14

根据这个问题所述,你应将已构建的node-sqlite3.node文件与使用pkg构建的二进制文件放置在同一目录下。该文件可在node_modules/sqlite3/lib/binding/node-vxx-xxxxx-xxx/node_sqlite3.node中找到。

另外,请确保您使用相同的Node版本同时使用pkg构建项目和sqlite3。


这个不起作用,请参考此问题 https://stackoverflow.com/questions/47789200/how-to-use-pkg-to-make-node-app-an-executable-with-a-native-dependency - simon-p-r
2
@simon-p-r:我的回答也反映在pkg手册中(https://github.com/zeit/pkg#native-addons),所以你的问题可能是pkg中的一个bug。 - Martin Klomp
@simon-p-r 您链接的问题已被删除。您能详细说明为什么这不起作用吗? - Ivan Rubinson

1

只需将以下内容添加到您的 package.json 文件中:

"pkg": {
    "assets": ["node_modules/sqlite3/lib/bindings"]
}

1

这是我针对Linux环境的完整GitLab CI解决方案:

我的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

请注意:
  • 您需要在构建系统中安装sqlite3软件包,否则您将无法在node_modules/sqlite3/lib/binding/下获得必要的绑定。在这里,您可以看到我正在我的debian系统中安装sqlite3软件包。
  • 如果您在alpine linux上构建,然后部署到debian\ubuntu\gentoo发布环境中,它将无法工作,因为alpine使用musl,而大多数其他linux系统使用glibc。您必须在发布时使用相同的系统进行构建。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接