用node做了一个小工具,希望能在别的没有node的环境使用,然后发现 pkg 可以做到打包node工程为exe文件,于是就尝试了一下,遇到很多坑,小记一下:
1.安装pkg
npm install -g pkg
2.pkg打包基本用法:
pkg index.js // 打包为Linux, macOS, Windows可执行文件
pkg -t node14-win-x64 index.js // 打包为Windows可执行文件
pkg . // 根据package.json中的配置打包
3.使用package.json配置pkg打包:
{
"bin": "XXX.js", // 入口文件,pkg通过package.json打包时必须配置
...
"pkg": {
"scripts": "build/**/*.js", // 打包包含内容,也可以使用 [] 数组形式
"asset": "views/**/*", // 打包包含内容,也可以使用 [] 数组形式,例:[ "assets/**/*", "images/**/*" ]
"options": [], // 可将一些运行时选项配置一起打包,填写选项可参考 node --help 、 node --v8-options 内的内容
"targets": ["node14-linux-arm64"], // 指定打包的目标平台和Node版本
"outputPath": "dist" // 打包后文件存放入 ./dist文件夹
...
}
}
"pkg": {
"scripts": "build/**/*.js",
"assets": "views/**/*",
"targets": [ "node14-linux-arm64" ],
"outputPath": "dist"
}
更多用法可查看
官方文档
在打包时,遇到的问题:
(1)报错:
Fetching base Node.js binaries to PKG_CACHE_PATH
fetched-v12.22.11-win-x64 [] 0%> Not found in remote cache:
{"tag": "v3.4", "name": "node-v12.22.11-win-x64"} ......
Error! AssertionError [ERR_ASSERTION]:The expression evaluated to a falsy value: ....
解决: 在
Releases · vercel/pkg-fetch · GitHub
下载缺失的二进制文件(我这里是node-v12.22.11-win-x64),下载后改名为 fetched-v12.22.11-win-x64 ,放置于缓存地址 .pkg-cache 文件内的
v3.4文件夹
(可能不存在,自己创建)
(2) 我的项目有axios依赖包,打包axios时失败:
Warning Failed to make bytecode node12-x64 for file C:\snapshot\XXX\node_modules\axios\index.js
....
解决:将axios版本降低为 v0.27 ,参考:
此处
(3)打包后生成exe文件,双击运行,失败,发现找不到静态文件index.html
解决: 使用index.html文件时不再使用 ./index.html 这种形式的路径,改为使用 path.join(__dirname,”/index.html”) 的方式作为文件路径。
版权声明:本文为start_XUEBA原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。