使用pkg打包Node.js程序时遇到mkdir路径异常问题
使用pkg打包Node.js程序时遇到mkdir路径异常问题
看起来你遇到了pkg打包后路径指向临时快照目录的常见问题,我来给你几个实用的解决方案:
首先得搞清楚为什么之前能用的process.cwd()突然失效了——这是因为pkg在运行打包后的程序时,会把代码解压到系统临时目录(也就是你看到的C://snapshot),如果你的程序启动时的工作目录恰好被切换到了这个临时目录,process.cwd()就会指向这里,而不是你双击程序的那个文件夹。
方案1:让输出目录和可执行文件同目录(最稳妥)
直接获取可执行文件的所在路径,把output目录建在这个位置,不管怎么启动程序,输出文件都会和你的exe文件在一起。修改你的代码如下:
const exportJsonFile = (dataItems, playlistId) => { // 获取可执行文件所在的目录 const executableDir = path.dirname(process.execPath); const outputDir = path.join(executableDir, 'output'); console.log(outputDir); const fileName = `playlist_${playlistId}.json`; const filePath = path.join(outputDir, fileName); if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } const jsonData = JSON.stringify(dataItems, null, 2); fs.writeFileSync(filePath, jsonData); console.log(`已导出到${filePath}`); askPlaylistId(); };
方案2:兼容工作目录和exe目录两种情况
如果你希望保留“在运行程序的目录生成output”的逻辑,但又要避免快照目录的问题,可以先判断当前工作目录是否是pkg的临时快照目录,如果是就切换到exe所在目录:
const exportJsonFile = (dataItems, playlistId) => { let outputDir; // 检查当前工作目录是否属于pkg的快照临时目录 if (process.cwd().includes('snapshot')) { // 切换到可执行文件所在目录 const executableDir = path.dirname(process.execPath); outputDir = path.join(executableDir, 'output'); } else { // 正常使用当前工作目录 outputDir = path.join(process.cwd(), 'output'); } console.log(outputDir); const fileName = `playlist_${playlistId}.json`; const filePath = path.join(outputDir, fileName); if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } const jsonData = JSON.stringify(dataItems, null, 2); fs.writeFileSync(filePath, jsonData); console.log(`已导出到${filePath}`); askPlaylistId(); };
方案3:区分打包和开发环境
如果你需要在开发时用__dirname,打包后用exe目录,可以借助pkg提供的process.pkg对象来判断当前是否是打包后的环境:
const exportJsonFile = (dataItems, playlistId) => { // 判断是否是pkg打包后的环境 const isPackaged = !!process.pkg; // 开发环境用__dirname,打包后用exe所在目录 const baseDir = isPackaged ? path.dirname(process.execPath) : __dirname; const outputDir = path.join(baseDir, 'output'); console.log(outputDir); const fileName = `playlist_${playlistId}.json`; const filePath = path.join(outputDir, fileName); if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } const jsonData = JSON.stringify(dataItems, null, 2); fs.writeFileSync(filePath, jsonData); console.log(`已导出到${filePath}`); askPlaylistId(); };
这些方案都能解决你遇到的mkdir路径跑到snapshot的问题,你可以根据自己的需求选择——个人推荐方案1,因为它最稳定,用户不管怎么运行你的程序,输出文件都会在exe旁边,不容易找不到。
备注:内容来源于stack exchange,提问作者user23381600
相关产品推荐
相关产品推荐

