Electron Packager打包频繁报EBUSY错误,如何实现自动重试?
解决Electron-Packager打包EBUSY资源锁定问题
问题背景
使用以下命令打包Angular转Electron桌面应用:
"package-win": "electron-packager . MyApp --protocol=myapp --protocol-name=\"MyApp Desktop\" --overwrite --prune --asar --platform=win32 --icon=./favicon.ico --out=build --version-string.CompanyName=\"My, LLC\" --version-string.FileDescription=CE --version-string.ProductName=\"MyApp\""
打包频繁失败,报错示例:
Packaging app for platform win32 x64 using electron v23.2.2 EBUSY: resource busy or locked, unlink 'C:\Users\Me\AppData\Local\Temp\electron-packager\win32-x64\MyApp-win32-x64-1jXU76\resources\app\node_modules\rxjs\_esm5\internal\util\subscribeToResult.js'
每次锁定文件不同,需手动删除系统临时目录下的electron-packager文件夹后重试,多次尝试才能成功。已试过直接命令行执行、检查文件进程占用、重启电脑,问题未解决。
解决方案
1. 实现自动重试打包
通过脚本包装打包命令,失败时自动清理临时目录并重试:
Windows批处理脚本(保存为package-win-retry.bat)
@echo off setlocal enabledelayedexpansion set MAX_RETRIES=10 set RETRY_COUNT=0 :RETRY echo 第 !RETRY_COUNT! 次尝试打包... call npm run package-win if %errorlevel% equ 0 ( echo 打包成功! exit /b 0 ) else ( echo 打包失败,清理临时目录... rmdir /s /q "C:\Users\Me\AppData\Local\Temp\electron-packager" set /a RETRY_COUNT+=1 if !RETRY_COUNT! lss !MAX_RETRIES! ( timeout /t 2 /nobreak >nul goto RETRY ) else ( echo 已重试!MAX_RETRIES!次仍失败,请手动检查。 exit /b 1 ) )
在package.json中添加新脚本:
"package-win-retry": "package-win-retry.bat"
Node.js脚本(保存为retry-pack.js)
const { execSync, rmSync } = require('child_process'); const path = require('path'); const MAX_RETRIES = 10; const TEMP_DIR = path.join(process.env.LOCALAPPDATA, 'Temp', 'electron-packager'); async function retryPackage() { let retries = 0; while (retries < MAX_RETRIES) { try { console.log(`第 ${retries + 1} 次尝试打包...`); execSync('npm run package-win', { stdio: 'inherit' }); console.log('打包成功!'); process.exit(0); } catch (err) { console.log('打包失败,清理临时目录...'); try { rmSync(TEMP_DIR, { recursive: true, force: true }); } catch (rmErr) { console.log('清理临时目录失败:', rmErr.message); } retries++; if (retries >= MAX_RETRIES) { console.log(`已重试${MAX_RETRIES}次仍失败,请手动排查。`); process.exit(1); } await new Promise(resolve => setTimeout(resolve, 2000)); } } } retryPackage();
在package.json中添加新脚本:
"package-win-retry": "node retry-pack.js"
2. 调整打包参数降低锁定概率
- 移除
--prune参数:prune过程可能导致文件临时占用,可提前手动清理node_modules中的无用文件后再打包。 - 自定义临时目录:用
--temp-dir指定项目内的临时目录,避免系统临时目录的干扰,修改后的命令:
"package-win": "electron-packager . MyApp --protocol=myapp --protocol-name=\"MyApp Desktop\" --overwrite --prune --asar --platform=win32 --icon=./favicon.ico --out=build --version-string.CompanyName=\"My, LLC\" --version-string.FileDescription=CE --version-string.ProductName=\"MyApp\" --temp-dir=./electron-temp"
打包前需确保./electron-temp目录已清空。
- 调整asar打包:若项目包含原生模块,添加
--asar-unpack="**/*.node";也可暂时去掉--asar参数测试,排查是否为asar打包导致的文件锁定。
3. 排查系统层面干扰
- 关闭实时杀毒软件:Windows Defender或第三方杀毒软件的实时扫描可能锁定临时文件,打包时临时关闭实时保护。
- 检查文件权限:确保当前用户对项目目录和临时目录拥有完全控制权限。
内容的提问来源于stack exchange,提问作者Blair Holmes
相关产品推荐
相关产品推荐

