Electron如何指向asar打包应用外部的路径?
Electron生产环境访问asar外部文件夹的解决方案
问题根源
开发模式下,相对路径dependencies/cleaner.py能正常指向项目根目录下的文件夹,但生产环境中Electron会将代码打包进asar文件,此时相对路径会默认从asar包内部的当前路径查找,而你的dependencies文件夹是在asar包外部的win-unpacked相关目录中,导致路径匹配失败。
解决步骤
- 获取可执行文件的绝对路径:通过Electron的
app.getPath('exe')获取当前运行的exe文件路径,再用path模块解析出exe所在的win-unpacked文件夹目录。 - 拼接外部文件夹的绝对路径:根据你构建后
dependencies的实际位置,拼接出该文件夹的绝对路径(比如如果dependencies和win-unpacked同级,就从exe目录向上跳转一级;如果在win-unpacked内部,直接在exe目录下拼接)。 - 替换代码中的相对路径:用拼接好的绝对路径替代原来的相对路径,确保能正确访问asar外部的文件。
修改后的代码示例
const { app } = require('electron'); const path = require('path'); const fs = require('fs'); ipcMain.on('saveExtractionData', (event, ...args) => { // Other code stuff ... if( !fs.existsSync( outputDir ) ){ console.log(`Output folder not exist. Creating folder at: ${outputDir}`); fs.mkdir( outputDir, (err) => { if( err ){ throw err } // 获取exe所在目录(win-unpacked文件夹路径) const exePath = app.getPath('exe'); const exeDir = path.dirname(exePath); // 根据实际目录结构拼接dependencies路径: // 情况1:dependencies和win-unpacked同级 const dependenciesDir = path.join(path.dirname(exeDir), 'dependencies'); // 情况2:dependencies在win-unpacked内部 // const dependenciesDir = path.join(exeDir, 'dependencies'); const cleanerPyPath = path.join(dependenciesDir, 'cleaner.py'); fs.readFile(cleanerPyPath, (error, buffer) => { if(error){ throw error } fs.writeFileSync( path.join(outputDir, 'cleaner.py'), buffer) }) fs.writeFile( path.join(outputDir, `${filename}.xlsx`), fileBuffer, (error) => { if( error ){ throw error } console.log(`Writing file ${filename}.xlsx into ${outputDir} folder...`); event.sender.send('resetExtractionData') }) }) } else { fs.writeFile( path.join(outputDir, `${filename}.xlsx`), fileBuffer, (error) => { if( error ){ console.log(error) throw error } console.log(`Writing file ${filename}.xslx into ${outputDir} folder...`) event.sender.send('resetExtractionData') }) } })
注意事项
- 确认构建后
dependencies文件夹的实际位置,选择对应的路径拼接方式。 - 测试生产环境时,直接运行
win-unpacked内的exe,可通过console.log(dependenciesDir)输出验证路径是否正确。
内容的提问来源于stack exchange,提问作者OHICT
相关产品推荐
相关产品推荐

