pkg 打包node服务端 填坑记录!!

产品服务端使用nodejs开发,部署时不能将代码部署到服务器,所以查到可用pkg将node服务端打包成exe,事先已经查了不少资料,本以为是一个很简单的事情,结果折腾了一天,才算搞定。
现将打包过程以及遇到的问题记录如下,希望可以帮助到后面的人。 填坑记录!!!!
 
打包流程记录:
1. 安装pkg
npm install -g pkg

2. 修改package.json,添加pkg配置和命令
"scripts": {
    .....,
    "pkg": "pkg . --out-path=dist/"
  },
  "bin": "./index.js",
  "pkg": {
    "scripts": "build/**/*.js",
    "assets": "views/**/*",
    "targets": [
      "node14"
    ],
    "outputPath": "dist"
  },

3. 执行命令 npm run pkg

 

备注: 不建议用pkg -t win index.js方法,坑太多,上面的package.json相对还是简单的。
----------------------------------------------------------------------------------------------------------------------------------------

// 遇到的问题总结
1. pkg与node版本不一致问题
当我们执行pkg -t win index.js 命令进行打包时会收到以下error提示
PS G:\pkg> pkg -t win index.js
> pkg@5.8.0
> Error! No available node version satisfies 'node13'

解决方法:将Node.js项目打包为一个可执行文件
https://swmlee.com/2019/12/18/technicalessays/pack-nodejs-project/
注意 pkg 支持的 nodejs 版本问题
如果安装的 pkg 版本,和实际需要打包的 nodejs 项目的版本不同,则可能会出现类似pkg error no available node version satisfies 'node 9'的报错信息。
经查询https://github.com/vercel/pkg-fetch/blob/main/patches/patches.json
{
  "v18.12.1": ["node.v18.12.1.cpp.patch"],
  "v16.18.1": ["node.v16.18.1.cpp.patch"],
  "v14.21.1": ["node.v14.21.1.cpp.patch"],
  "v12.22.11": ["node.v12.22.11.cpp.patch"],
  "v10.24.1": ["node.v10.24.1.cpp.patch"],
  "v8.17.0": ["node.v8.17.0.cpp.patch"]
}
需要将node升级到以上版本,我是将node 升级到 v14.21.1, 升级方法如下:
node v14.21.1下载地址
https://registry.npmmirror.com/binary.html?path=node/latest-v14.x/

2. 无法加载文件 C:\Users\*\AppData\Roaming\npm\pkg.ps1,因为在此系统上禁止运行脚本。
pkg : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\pkg.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/
go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1

解决方法: https://blog.csdn.net/weixin_39729729/article/details/119766261

3. 执行exe时提示需要手动安装mysql2包
PS G:\pkg> .\server.exe
pkg/prelude/bootstrap.js:1876
      throw error;
      ^

Error: Please install mysql2 package manually

解决方法: 看node_modules目录下是否有sequelize和mysql2
npm install --save sequelize
npm install mysql2 --save

4. 执行exe时提示 不能创建目录。
PS G:\pkg> .\server.exe
pkg/prelude/bootstrap.js:1876
      throw error;
      ^

Error: Cannot mkdir in a snapshot. Try mountpoints instead.
at mkdirFailInSnapshot (pkg/prelude/bootstrap.js:1636:7)
    at Object.mkdirSync (pkg/prelude/bootstrap.js:1648:12)
    at mkdir (C:\snapshot\pkg\node_modules\streamroller\lib\RollingFileWriteStream.js:270:19)
解决方法:通过代码走查 nodejs后端只有log4js(日志打印)中用到了目录创建,将其卸载
npm uninstall log4js -s
注释掉 所有使用 logUtil 的地方, 删除

重新打包 npm run pkg , 再次执行 .\****.exe, 通过。

5. 缓存里缺少相应的二进制文件fetched-v16.14.2-win-x64
$ pkg -t win server.js
> pkg@5.6.0
> Fetching base Node.js binaries to PKG_CACHE_PATH
  fetched-v16.14.2-win-x64            [                    ] 0%> Not found in remote cache:
  {"tag":"v3.3","name":"node-v16.14.2-win-x64"}
> Building base binary from source:

解决方案: https://segmentfault.com/a/1190000041958374?sort=votes
 
参考资料:
pkg打包官网教程
https://www.npmjs.com/package/pkg

使用 pkg 打包 node服务端 项目
https://blog.csdn.net/u014675852/article/details/115915179

将Node.js项目打包为一个可执行文件
https://swmlee.com/2019/12/18/technicalessays/pack-nodejs-project/

一处打包,到处运行,用pkg打包nodejs应用!
https://segmentfault.com/a/1190000041958374?sort=votes

将Node.js项目打包为一个可执行文件
https://swmlee.com/2019/12/18/technicalessays/pack-nodejs-project/

解决问题:无法加载文件 C:\Users\*\AppData\Roaming\npm\pkg.ps1,因为在此系统上禁止运行脚本。
https://blog.csdn.net/weixin_39729729/article/details/119766261

node v14.21.1下载地址
https://registry.npmmirror.com/binary.html?path=node/latest-v14.x/
posted on 2022-12-22 16:44  3D入魔  阅读(5043)  评论(0编辑  收藏  举报