You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PKG打包Node项目运行时报ENOENT找不到/snapshot下cwebp文件如何解决

PKG打包Node项目webp-converter二进制文件缺失解决方案

根因说明

问题由两个核心错误导致:

  1. pkg配置中assets路径以/开头,会被识别为系统根目录,你声明的/node_modules/**/*规则根本没有匹配到项目内的node_modules,二进制文件没有被打进snapshot包
  2. 你使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:45:04