开发环境生成正常,打包成单文件 exe 后报 ENOENT: no such file or directory, scandir 'C:\Users\ADMINI~1\AppData\Local\Temp\...\templates'。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

pkg . --targets node18-win-x64 --assets "templates/**/*"
.\create-app.exe --dry-run --verbose

模板路径用 __dirname 拼接,单文件打包时脚本被解到临时目录,模板资源没跟着进去。开发环境读的是源码目录,所以看不出问题。这一点先确认清楚,后面就不用反复试。

「模板路径硬编码」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

具体做法是,用打包工具的资源配置把 templates 目录声明为外部资源;运行时用 process.resourcesPath 或 pkg 的 assets 取路径;启动时先判断目录是否存在 不存在就打印实际路径;在 CI 里跑一次打包产物的冒烟生成。

改完照着核一遍,打包后的 exe 在干净机器上生成成功 启动日志里打印的模板路径指向 resources 目录。

作者 9823189