如何重定向Electron默认文件路径,调整便携版程序目录结构?
可行解决方案
你不需要修改业务逻辑层面的package.json配置,通过以下两个适配便携场景的方案即可完成文件整理,完全避开你提到的不适用方案:
方案1:调整Electron打包配置(适用electron-builder打包场景)
如果你是用electron-builder打便携包,直接修改打包配置即可实现根目录仅保留主exe,所有依赖资源统一收纳到指定子目录,配置示例如下:
在package.json的build字段新增以下配置:
{ "build": { "portable": { "unpackDirName": "app_resources", "requestExecutionLevel": "asInvoker" }, "files": [ "**/*", "!**/node_modules/*/{CHANGELOG.md,README.md,README,readme.md,readme}", "!**/node_modules/*/{test,__tests__,tests,powered-test,example,examples}" ] } }
配置说明:
- 打包后根目录只有你的主exe文件,所有运行依赖都会放到
app_resources子目录,用户只需点击根目录的exe即可启动 - 你要修改脚本/页面内容时,直接进入
app_resources/resources/app下修改对应文件即可,无需全量重新打包
方案2:自制极简启动器(适合高频修改业务代码场景)
如果不想调整打包配置,可以编译一个不到100KB的极简C++启动器,根目录仅保留这个支持自定义图标的启动器exe,所有原始Electron程序文件全部放到core子目录即可,启动器代码示例:
#include <windows.h> #include <shellapi.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { SHELLEXECUTEINFO sei = {0}; sei.cbSize = sizeof(SHELLEXECUTEINFO); sei.fMask = SEE_MASK_NOCLOSEPROCESS; sei.lpVerb = L"open"; sei.lpFile = L"core\\你的原程序名.exe"; // 替换为你的Electron主exe文件名 sei.lpParameters = GetCommandLineW(); sei.nShow = SW_SHOWNORMAL; ShellExecuteEx(&sei); if (sei.hProcess) { WaitForSingleObject(sei.hProcess, INFINITE); CloseHandle(sei.hProcess); } return 0; }
方案优势:
- 启动器可自定义图标,编译一次可永久使用,后续更新业务代码仅需替换
core目录下的内容即可,无需修改启动器 - 完全不需要给用户额外说明使用方法,直接点击根目录的启动器exe即可运行
- 完全保留便携属性,整个程序目录可以任意移动、拷贝,不会出现路径错误
两个方案均不需要创建隐藏目录、bat脚本、快捷方式,也不需要将程序编译为单exe文件,符合你的使用场景需求。
内容的提问来源于stack exchange,提问作者Josh Celnik
相关产品推荐
相关产品推荐

