Node.js使用pkg打包为可执行文件后无法读取外部CSV文件如何解决?
解决方案
问题根因
pkg打包后运行时,__dirname指向的是exe内部的虚拟文件系统路径,并非exe实际存放的磁盘目录,所以拼接的路径无法定位到外部独立的CSV文件。
直接适配pkg的实现方法
不需要将CSV加入assets配置,只需要修改路径获取逻辑即可:
- 首先引入
path模块做路径拼接,避免跨平台斜杠兼容问题 - 用
process.execPath获取当前运行的可执行文件的绝对路径,提取其所在目录作为基础路径 - 加环境判断兼容开发、打包两种运行场景
示例代码:
const path = require('path') const fs = require('fs') // 区分打包环境和开发环境的基础路径 const baseDir = process.pkg ? path.dirname(process.execPath) : __dirname const filename = path.join(baseDir, 'data', 'streets_profiles.csv') // 后续读取逻辑不变 fs.createReadStream(filename) .pipe(parse({ delimiter: ',' })) .on('data', (r) => { //console.log("r: ", r); data.push(r); }) .on('end', async () => { //... 后续处理
- 打包后的使用方式:将存放CSV的
data文件夹和生成的exe放在同级目录即可,CSV可任意修改,不需要重新打包。
替代打包工具方案
如果不想用pkg,也可以选择以下无这类路径限制的打包工具:
nexe:和pkg功能类似的Node.js单文件打包工具,配置更轻量,外部文件读取逻辑和上述方案完全兼容Bun:用bun build --compile filename.js命令可直接打包为独立可执行文件,打包速度、运行性能都优于pkg,原生支持读取外部文件,不需要额外做特殊适配
内容的提问来源于stack exchange,提问作者S..
相关产品推荐
相关产品推荐

