我在 NodeJS 上使用 nexe 编译的可执行文件无法在其他位置运行

问题描述 投票:0回答:1

请注意,我使用的是 NodeJS v16.16.0

当使用 nexe 编译我的文件时,一切都按预期工作,直到我尝试更改文件位置,此时程序停止运行。寻求解决此问题的指导。

看起来这是由sqlite3导入引起的,所以我仍然使用Nexe使用位于node_modules文件夹中的-r node_sqlite3.node选项以这种方式导入它,但它仍然不起作用。

"compile": "nexe ./vare.js -r node_modules/sqlite3/build/Release/node_sqlite3.node -o compiled --build"

此行位于我的 package.json

当我执行我编译的.exe时, 当可执行文件位于我构建它的目录时它会起作用,因此如果我更改到另一个目录,它会显示此错误:

C:\Users\Administrator\Documents>compiled.exe
C:\Users\Administrator\Documents\node_modules\bindings\bindings.js:211
      throw new Error(
      ^

Error: Could not find module root given file: "C:\Users\Administrator\Documents\node_modules\sqlite3\lib\sqlite3-binding.js". Do you have a `package.json` file?
    at Function.getRoot (C:\Users\Administrator\Documents\node_modules\←[4mbindings←[24m\bindings.js:211:13)
    at bindings (C:\Users\Administrator\Documents\node_modules\←[4mbindings←[24m\bindings.js:82:32)
    at Object.<anonymous> (C:\Users\Administrator\Documents\node_modules\←[4msqlite3←[24m\lib\sqlite3-binding.js:1:37)
←[90m    at Module._compile (node:internal/modules/cjs/loader:1105:14)←[39m
←[90m    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)←[39m
←[90m    at Module.load (node:internal/modules/cjs/loader:981:32)←[39m
←[90m    at Function.Module._load (node:internal/modules/cjs/loader:822:12)←[39m
←[90m    at Module.require (node:internal/modules/cjs/loader:1005:19)←[39m
←[90m    at require (node:internal/modules/cjs/helpers:102:18)←[39m
    at Object.<anonymous> (C:\Users\Administrator\Documents\node_modules\←[4msqlite3←[24m\lib\sqlite3.js:2:17)
javascript node.js sqlite node-sqlite3 nexe
1个回答
0
投票

我也有同样的问题。我通过使用 better-sqlite3 模块解决了这个问题。它有一个nativeBinding选项。该选项可用于指定 sqlite 本机 .node 依赖文件的文件路径。如果提供此选项,则 better-sqlite3 模块将不会使用绑定模块来定位 .node 文件,因此不会发生绑定模块的错误。

let dbOptions = { fileMustExist: true };
if (appEnv.inPKG) {
  dbOptions.nativeBinding = path_join(
    appEnv.pkgRoot,
    "node_modules/better-sqlite3/build/Release/better_sqlite3.node"
  );
}
let db = new Database(dbPath, dbOptions);
// now works..
© www.soinside.com 2019 - 2024. All rights reserved.