大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说pkg打包使用sqlite3的node项目,希望您对编程的造诣更进一步.
问题发现
pkg是一个可以把node项目将程序和运行环境整体打包成一个应用程序的库,这样在程序分发时可以有一定的保密性,避免源代码的暴露,除了打包比较慢以及包比较大之外,整体来说使用起来还是比较舒服的。
备注另一种node项目的打包工具ncc,通过webpack将源码打包成一个类似前端打包输出的文件夹,index.js作为整体程序的入口,但是我测试一直没有成功,先留个记录。
但是当sqlite数据库引入项目后,通过pkg打包就不灵了。分别测试了两个sqlite的依赖包(sqlite3、better-sqlite3),node开发环境测试都是正常的,数据库操作都没问题,但是打包之后就不行了。
- sqlite3这个包引入之后用pkg打包,生成的exe启动后直接闪退
- better-sqlite3这个包引入之后用pkg打包,生成的exe启动后是正常的,但是会报
找不到绑定文件
的错误,具体如下
Error: Could not locate the bindings file. Tried:
→ C:\snapshot\***\node_modules\better-sqlite3\build\better_sqlite3.node
......
但是问题是C盘根本就没有这个路径,那pkg打包后的文件为什么要去这个路径去找文件呢
具体原因具体可以看这个 使用pkg打包nodejs项目并解决本地文件读取问题
简单来说就是pkg打包前后的路径是有变化的,比如打包的时候用 pkg /path/app.js ,那么打包后,程序里面的 __filename
就是 /snapshot/path/app.js
;程序里面的 __dirname
就是 /snapshot/path
;process.cwd()
就是打包后的可执行程序当前路径。但是路径变化后怎么让程序找到这个文件呢?
直到看到了这篇文章 使用pkg编译打包nodejs程序成执行文件 里面的这句话
如果有native addon的话,pkg不支持将addon (.node文件)打包进exe, 所以如果自己写的.node文件或者引用的module里面有.node文件,需要打包完之后将.node文件放到跟exe一个目录里面。
上面程序报的就是找不到.node文件的错误,果断在 \node_modules\better-sqlite3\build\Release
目录下找到 better_sqlite3.node
,拷贝到pkg打包的程序同目录下,问题解决。
问题深入
native addon是什么呢?
Node addon 是由 C++ 编写的动态链接库,是对 Node 能力的扩展。通过特定的方式实现功能,然后编译成 .node 文件,Node 的 require() 方法可以直接加载 .node 文件到代码中使用。
better-sqlite3的github库中的的语言分布如下,可以看到C++占了一半多。因此程序运行时就需要调用 .node 文件执行由C++实现的底层操作。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13118.html