pkg打包使用sqlite3的node项目

pkg打包使用sqlite3的node项目pkg打包使用sqlite3的node项目时通过将.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/pathprocess.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++实现的底层操作。

image.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13118.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注