用pkg把nodejs程序打包成exe【附踩坑记录】

6,584 阅读1分钟

pkg是一个可以将nodejs程序打包成exe文件的工具,免去我们的nodejs程序在客户电脑上跑时需要客户下载node环境。不仅可以打包成exe在window上跑,还可以打包成linux/mac下的可执行程序,具体支持的平台如下: image.png

操作流程

先建一个js文件

// src/index.js
const express = require('express')
const dayjs = require('dayjs')
const app = express()

app.get('/hello', (req, res) => {
    res.send(dayjs().format('YYYY/MM/DD'))
    res.end
})
const port = 9090

app.listen(port)

安装pkg

cnpm i -g pkg

打包

pkg ./src/index.js -t win -o app

可能碰到的问题

image.png

如上图,可能出现下载很慢的情况,也可能因为下载太慢而超时,报如下错

$ pkg -t win server.js
> pkg@5.8.0
> Fetching base Node.js binaries to PKG_CACHE_PATH
  fetched-v16.16.0-win-x64            [                    ] 0%> Not found in remote cache:
  {"tag":"v3.4","name":"node-v16.16.0-win-x64"}
> Building base binary from source:
  built-v16.14.2-win-x64
> Fetching Node.js source archive from nodejs.org...
> Error! AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:

可以手动下载相应的文件,放到缓存目录里。

  1. github上下载到相应的文件,比如我的报错中提示需要下载这个文件{"tag":"v3.4","name":"node-v16.16.0-win-x64"},就可以在这里找到。 image.png image.png image.png

  2. 下载下来后放到.pkg-cache这个文件夹下对应的tag目录下(还是看报错信息中的{"tag":"v3.4","name":"node-v16.16.0-win-x64"},得知我的tag是v3.4),我的目录路径是C:\Users\Administrator\.pkg-cache\v3.4 image.png

  3. 下载下来的文件原名是node-v16.16.0-win-x64,需要改成fetched-v16.16.0-win-x64,因为看报错信息中,打包脚本就是要下载成这个名字。

  4. 还有一个注意项,我之前设置了PKG_CACHE_PATH环境变量,设置到其他目录,这时脚本就会往那个目录下载。第三步中的文件就要放到PKG_CACHE_PATH所指向的目录下的v3.4了。

  5. 再执行打包命令就成功了,成功的日志很少。如下: image.png