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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:53:09