使用PKG打包Node项目运行时报ENOENT找不到/snapshot下cwebp文件如何解决
PKG打包Node项目webp-converter二进制文件缺失解决方案
根因说明
问题由两个核心错误导致:
- pkg配置中
assets路径以/开头,会被识别为系统根目录,你声明的/node_modules/**/*规则根本没有匹配到项目内的node_modules,二进制文件没有被打进snapshot包 - 你使用
process.cwd()拼接文件路径,pkg打包后运行时process.cwd()指向可执行文件的启动目录,不是snapshot虚拟文件系统的根目录,路径匹配完全失效
具体修复步骤
- 第一步:修正package.json中的pkg配置,去掉assets路径开头的斜杠,优先指定webp-converter的资源路径,避免全量打包node_modules导致体积过大
"pkg": { "outputPath": "dist", "assets": [ "node_modules/webp-converter/**/*" ], // 可补充指定你的目标打包平台,避免多平台冗余 "targets": ["node18-macos-x64"] }
- 第二步:替换路径拼接逻辑,不要使用
process.cwd(),改用__dirname拼接相对路径,pkg会自动适配snapshot虚拟路径,示例代码如下:
const path = require('path') const fs = require('fs') const cwebpRelativePath = 'node_modules/webp-converter/bin/libwebp_osx/bin/cwebp' // 按你当前代码文件的层级调整相对路径,比如你的代码在src/index.js,就写成`../${cwebpRelativePath}` const cwebpPath = path.join(__dirname, cwebpRelativePath) // 运行前先补执行权限,解决chmod报错 if (typeof process.pkg !== 'undefined') { fs.chmodSync(cwebpPath, 0o755) }
- 第三步:如果以上配置不生效,可以采用外置二进制方案:打包时不把webp-converter的二进制打进执行文件,把
libwebp_osx整个目录和生成的可执行文件放在同一目录,代码里优先读取同级目录的cwebp文件即可。 - 可选优化:升级pkg到最新版本,避免旧版本的资源打包bug,执行命令
npm install -g pkg@latest即可。
内容的提问来源于stack exchange,提问作者Nis
相关产品推荐
相关产品推荐

