使用PKG编译Node.js项目后运行exe时报sqlite3相关EISDIR错误
问题根因
你只配置了打包sqlite3的package.json,但node-pre-gyp的路径查找逻辑在pkg的快照虚拟文件系统中无法正确解析路径,返回的binding_path最终指向目录而非.node二进制绑定文件,才会触发EISDIR报错。
可行解决方案
方案一:修改绑定引入逻辑(最稳定)
步骤1:更新pkg配置
在assets字段中添加sqlite3的二进制绑定文件匹配规则,同时确认打包目标和你安装sqlite3时的Node版本、平台架构严格对应:
"pkg": { "scripts": [ "commands/*.js", "events/*.js", "node_modules/es-get-iterator/*.js" ], "assets": [ "media/**/*", "node_modules/sqlite3/package.json", "node_modules/sqlite3/lib/binding/**/*.node" ], "targets": ["node18-win-x64"] // 替换为你实际使用的Node版本+平台架构 }
步骤2:绕过node-pre-gyp路径查找
直接修改node_modules/sqlite3/lib/sqlite3-binding.js的代码,替换原有逻辑,直接引入对应二进制文件:
var path = require('path'); // 路径替换为你实际的.node文件路径,和assets中配置的打包路径对应 var binding = require(path.join(__dirname, './binding/napi-v6-win32-x64/node_sqlite3.node')); module.exports = exports = binding;
步骤3:重新打包即可正常运行。
方案二:替换依赖(低改造成本)
直接将依赖替换为对pkg兼容性更好的better-sqlite3,仅需要在pkg的assets中添加node_modules/better-sqlite3/build/Release/better_sqlite3.node即可,不需要修改源码,适配成本极低。
内容的提问来源于stack exchange,提问作者Neklioz
相关产品推荐
相关产品推荐

